[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Null в качестве разделителя в скрипте



> В shell скрипте обрабатывается список в котором в качестве разделителя
> используется нулевой символ '\0'. Вроде совместимо с POSIX, но нужное
> поведение есть только в zsh. В bash и dash ведет себя неправильно.
>
> IFS=$(printf '\0')
> for i in $(seq 1 10 | tr '\n' '\0')
> do
>     echo "i = $i"
> done
> Пробовал различные варианты задания IFS: IFS=; IFS=''; IFS=$'\0';
> IFS=$(echo -en "\0") и т.д., но это не решает проблему.
>
> Как обойти проблему с помощью того же xargs или while/read я знаю. Меня
> интересует почему не работает вариант с for.

Вы знаете, как *решить* проблему с помощью ‘while read’.  Для тех, кто не знает, сообщаю:

,----
| $ while read -r -d ''; do
| >       printf 'i = %s\n' "$REPLY"
| > done < \
| >      <(seq 1 10 | tr ' ' '\0')
| i = 1
| i = 2
| i = 3
| i = 4
| i = 5
| i = 6
| i = 7
| i = 8
| i = 9
| i = 10
`----

*Обойти* корректное решение с помощью словоделения в данном случае, слава богу, невозможно.

> Подозреваю, что я где-то заблуждаюсь и потому у меня не работает -
> может кто-то подскажет в чем моя ошибка?

Вы пытаетесь злоупотребить механизмом словоделения для реализации построчного чтения.  По версии Грега Вулиджа это ошибка № 1 программировании на ГНУ Баше и сходных с ним языках.  Ваше повезло, что вы натолкнулсь на ошибку так рано.

Reply to: