30.11.2016 18:25, Andrey Tataranovich пишет:
> Доброго времени суток.
>
> В shell скрипте обрабатывается список в котором в качестве разделителя
> используется нулевой символ '\0'. Вроде совместимо с POSIX, но нужное
> поведение есть только в zsh. В bash и dash ведет себя неправильно.
>
> Код -------------------------------------------------------------------
> IFS=$(printf '\0')
> for i in $(seq 1 10 | tr '\n' '\0')
> do
>     echo "i = $i"
> done
>
> Вывод -----------------------------------------------------------------
> zsh /tmp/list.sh
> i = 1
> i = 2
> i = 3
> i = 4
> i = 5
> i = 6
> i = 7
> i = 8
> i = 9
> i = 10
> i =
>
> bash /tmp/list.sh
> i = 12345678910
>
> dash /tmp/list.sh
> i = 12345678910
>
> Пробовал различные варианты задания IFS: IFS=; IFS=''; IFS=$'\0';
> IFS=$(echo -en "\0") и т.д., но это не решает проблему.
>
> Как обойти проблему с помощью того же xargs или while/read я знаю. Меня
> интересует почему не работает вариант с for. Подозреваю, что я где-то
> заблуждаюсь и потому у меня не работает - может кто-то подскажет в чем
> моя ошибка?
>
Поведение ksh тоже не совпадает с ожиданием.

$ cat test_null.sh
#!/bin/ksh -x

IFS=$(printf '\0')
for i in $(seq 1 10 | tr '\n' '\0')
do
    echo "i = $i"
done

$ ./test_null.sh
+ printf '\0'
+ IFS=''
+ tr '\n' '\0'
+ seq 1 10
+ echo 'i = 1'
i = 1

Похоже, всё таки, ожидание не совсем верное.

Ответить