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

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



On Wed, 30 Nov 2016, Andrey Tataranovich wrote:

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

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

--
WBR, Andrey Tataranovich


  Как я понимаю, ноги растут из языка С. Да и в стандарте POSIX [1]:
  строка не может содержать \0, а может только заканчиваться на \0.
  Так что bash строго следует стандарту и в результате
  $(seq 1 10 | tr '\n' '\0') дает с точки зрения стандарта
  «плохую» строку о чем честно и предупреждает:
        command substitution: ignored null byte in input

  for и IFS не при чем, можете попробовать в bash и zsh:
  echo $(seq 9 | tr '\n' '\0')

  Ю.

  [1]  http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap03.html#tag_03_92

Reply to: