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 Похоже, всё таки, ожидание не совсем верное.