Re: Null в качестве разделителя в скрипте
On 2016-12-01, Artem Chuprina wrote: > >> Но в принципе, уже достаточно полистать историю правок к скриптам > >> пакетов в дебиане за период, когда шла волна борьбы за работу скриптов в > >> dash. То и дело всплывала вычистка башизмов из скриптов, начинающихся на > >> #!/bin/sh. > > > Простите, а это здесь каким боком? > > Элементарно, Ватсон. Понимание башем башизма в режиме совместимости с > /bin/sh не является POSIX-совместимым. Потому что не позволяет заменить > /bin/sh на другой POSIX-совместимый для выполнения этого скрипта. Может те случаи подпадали под undefined behavior? В результате скрипты переписали, исключив элемент неоднозначности, допустимый стандартом? bash(1): Bash is intended to be a conformant implementation of the Shell and Utilities portion of the IEEE POSIX specification (IEEE Standard 1003.1). Bash can be configured to be POSIX-conformant by default. If bash is invoked with the name sh, it tries to mimic the startup behavior of historical versions of sh as closely as possible, while conforming to the POSIX standard as well. Все что не так - это ошибка и будет исправлено в новой версии. В ``info bash`` описаны 2 несоответствия POSIX: There is other POSIX behavior that Bash does not implement by default even when in POSIX mode. Specifically: 1. The 'fc' builtin checks '$EDITOR' as a program to edit history entries if 'FCEDIT' is unset, rather than defaulting directly to 'ed'. 'fc' uses 'ed' if 'EDITOR' is unset. 2. As noted above, Bash requires the 'xpg_echo' option to be enabled for the 'echo' builtin to be fully conformant. -- http://defun.work/
Re: Null в качестве разделителя в скрипте
Спасибо всем ответившим на вопрос. On Thu, 1 Dec 2016 22:20:38 -0500 Tim Sattarov wrote: > Нашёл такой же вопрос, буквально один в один, на стэковерфлоу: > http://stackoverflow.com/questions/8677546/bash-for-in-looping-on-null-delimited-string-variable Я уже видел подобные ответы и потому изначально писал, что знаю как обойти ограничение при помощи while/read или xargs -0. Но я не нашел ответа, почему оно не работает с for. Кстати я как-то заметил, что echo "$(seq 1 10 | tr '\n' '\0')" | hexdump -C вырезает нулевой символ из строки, но почему-то не придал этому факту значения. -- WBR, Andrey Tataranovich
Re: Null в качестве разделителя в скрипте
On 30/11/16 10:25 AM, 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. Подозреваю, что я где-то > заблуждаюсь и потому у меня не работает - может кто-то подскажет в чем > моя ошибка? > Нашёл такой же вопрос, буквально один в один, на стэковерфлоу: http://stackoverflow.com/questions/8677546/bash-for-in-looping-on-null-delimited-string-variable
Re: Null в качестве разделителя в скрипте
> Dmitry Alexandrov -> debian-russian@lists.debian.org @ Thu, 01 Dec 2016 > 14:17:22 +0300: > > >> >> >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов > соблюдения > >> >> >> стандартов. В команде zsh на этом изрядно заморочены, в команде > dash - > >> >> >> так себе, они скорее делают свой шелл таким, чтобы то, что он > понимает, > >> >> >> без сюрпризов работало в любом другом шелле, делающем вид, что он > >> >> >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. > >> >> > >> >> > Последнее на первый взгляд звучит как чушь. Можно источник? > >> >> > >> >> bash > >> > >> > И пара примеров, конечно, без труда найдется (в позиксном режиме, > >> > который при запуске за «sh», разумеется)? > >> > >> Сходу нет. Он слишком крив для того, чтобы я им пользовался. Что самое > >> неприятное, ВНЕЗАПНО крив. > > > Ну а на это-то заявление пара примеров найдется сходу? > > Приходите лет на 10 раньше, когда я пытался еще писать на баше и ходил > по этим граблям. > > >> Но в принципе, уже достаточно полистать историю правок к скриптам > >> пакетов в дебиане за период, когда шла волна борьбы за работу скриптов в > >> dash. То и дело всплывала вычистка башизмов из скриптов, начинающихся на > >> #!/bin/sh. > > > Простите, а это здесь каким боком? > > Элементарно, Ватсон. Понимание башем башизма в режиме совместимости с > /bin/sh не является POSIX-совместимым. Потому что не позволяет заменить > /bin/sh на другой POSIX-совместимый для выполнения этого скрипта. Э... Дорогой Холмс, вы всерьез полагаете, что ПОЗИКС предписывает оболочке (или любой другой программе) быть урезанным обрубком? Если да, то как вы это ухитряетесь сочетать с верой в то, что «в команде zsh изрядно заморочены [на стандартах]»?
Re: Null в качестве разделителя в скрипте
Dmitry Alexandrov -> debian-russian@lists.debian.org @ Thu, 01 Dec 2016 14:17:22 +0300: >> >> >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения >> >> >> стандартов. В команде zsh на этом изрядно заморочены, в команде >> dash - >> >> >> так себе, они скорее делают свой шелл таким, чтобы то, что он >> понимает, >> >> >> без сюрпризов работало в любом другом шелле, делающем вид, что он >> >> >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. >> >> >> >> > Последнее на первый взгляд звучит как чушь. Можно источник? >> >> >> >> bash >> >> > И пара примеров, конечно, без труда найдется (в позиксном режиме, >> > который при запуске за «sh», разумеется)? >> >> Сходу нет. Он слишком крив для того, чтобы я им пользовался. Что самое >> неприятное, ВНЕЗАПНО крив. > Ну а на это-то заявление пара примеров найдется сходу? Приходите лет на 10 раньше, когда я пытался еще писать на баше и ходил по этим граблям. >> Но в принципе, уже достаточно полистать историю правок к скриптам >> пакетов в дебиане за период, когда шла волна борьбы за работу скриптов в >> dash. То и дело всплывала вычистка башизмов из скриптов, начинающихся на >> #!/bin/sh. > Простите, а это здесь каким боком? Элементарно, Ватсон. Понимание башем башизма в режиме совместимости с /bin/sh не является POSIX-совместимым. Потому что не позволяет заменить /bin/sh на другой POSIX-совместимый для выполнения этого скрипта.
Re: Null в качестве разделителя в скрипте
> >> >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения > >> >> стандартов. В команде zsh на этом изрядно заморочены, в команде dash - > >> >> так себе, они скорее делают свой шелл таким, чтобы то, что он > понимает, > >> >> без сюрпризов работало в любом другом шелле, делающем вид, что он > >> >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. > >> > >> > Последнее на первый взгляд звучит как чушь. Можно источник? > >> > >> bash > > > И пара примеров, конечно, без труда найдется (в позиксном режиме, > > который при запуске за «sh», разумеется)? > > Сходу нет. Он слишком крив для того, чтобы я им пользовался. Что самое > неприятное, ВНЕЗАПНО крив. Ну а на это-то заявление пара примеров найдется сходу? > Но в принципе, уже достаточно полистать историю правок к скриптам > пакетов в дебиане за период, когда шла волна борьбы за работу скриптов в > dash. То и дело всплывала вычистка башизмов из скриптов, начинающихся на > #!/bin/sh. Простите, а это здесь каким боком?
Re: Null в качестве разделителя в скрипте
Dmitry Alexandrov -> debian-russian@lists.debian.org @ Thu, 01 Dec 2016 14:01:01 +0300: >> >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения >> >> стандартов. В команде zsh на этом изрядно заморочены, в команде dash - >> >> так себе, они скорее делают свой шелл таким, чтобы то, что он понимает, >> >> без сюрпризов работало в любом другом шелле, делающем вид, что он >> >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. >> >> > Последнее на первый взгляд звучит как чушь. Можно источник? >> >> bash > И пара примеров, конечно, без труда найдется (в позиксном режиме, > который при запуске за «sh», разумеется)? Сходу нет. Он слишком крив для того, чтобы я им пользовался. Что самое неприятное, ВНЕЗАПНО крив. Но в принципе, уже достаточно полистать историю правок к скриптам пакетов в дебиане за период, когда шла волна борьбы за работу скриптов в dash. То и дело всплывала вычистка башизмов из скриптов, начинающихся на #!/bin/sh.
Re: Null в качестве разделителя в скрипте
> >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения > >> стандартов. В команде zsh на этом изрядно заморочены, в команде dash - > >> так себе, они скорее делают свой шелл таким, чтобы то, что он понимает, > >> без сюрпризов работало в любом другом шелле, делающем вид, что он > >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. > > > Последнее на первый взгляд звучит как чушь. Можно источник? > > bash И пара примеров, конечно, без труда найдется (в позиксном режиме, который при запуске за «sh», разумеется)?
Re: Null в качестве разделителя в скрипте
Dmitry Alexandrov -> debian-russian@lists.debian.org @ Thu, 01 Dec 2016 03:11:10 +0300: >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения >> стандартов. В команде zsh на этом изрядно заморочены, в команде dash - >> так себе, они скорее делают свой шелл таким, чтобы то, что он понимает, >> без сюрпризов работало в любом другом шелле, делающем вид, что он >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. > Последнее на первый взгляд звучит как чушь. Можно источник? bash
Re: Null в качестве разделителя в скрипте
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 Похоже, всё таки, ожидание не совсем верное.
Re: Null в качестве разделителя в скрипте
> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения > стандартов. В команде zsh на этом изрядно заморочены, в команде dash - > так себе, они скорее делают свой шелл таким, чтобы то, что он понимает, > без сюрпризов работало в любом другом шелле, делающем вид, что он > понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX. Последнее на первый взгляд звучит как чушь. Можно источник?
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.