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

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



Andrey Tataranovich -> debian-russian  @ Wed, 30 Nov 2016 18:25:40 +0300:

 > Доброго времени суток.

 > В 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. Подозреваю, что я где-то
 > заблуждаюсь и потому у меня не работает - может кто-то подскажет в чем
 > моя ошибка?

Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения
стандартов. В команде zsh на этом изрядно заморочены, в команде dash -
так себе, они скорее делают свой шелл таким, чтобы то, что он понимает,
без сюрпризов работало в любом другом шелле, делающем вид, что он
понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX.


Reply to: