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

2016-12-10 Пенетрантность Oleksandr Gavenko
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 в качестве разделителя в скрипте

2016-12-01 Пенетрантность Andrey Tataranovich
Спасибо всем ответившим на вопрос.

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 в качестве разделителя в скрипте

2016-12-01 Пенетрантность Tim Sattarov
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 в качестве разделителя в скрипте

2016-12-01 Пенетрантность Dmitry Alexandrov
> 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 в качестве разделителя в скрипте

2016-12-01 Пенетрантность Artem Chuprina
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 в качестве разделителя в скрипте

2016-12-01 Пенетрантность Dmitry Alexandrov
>  >>  >> Заблуждаешься ты в основном в том, что ожидаешь от шеллов соблюдения
>  >>  >> стандартов. В команде zsh на этом изрядно заморочены, в команде dash -
>  >>  >> так себе, они скорее делают свой шелл таким, чтобы то, что он 
> понимает,
>  >>  >> без сюрпризов работало в любом другом шелле, делающем вид, что он
>  >>  >> понимает язык /bin/sh. А bash гарантированно не соблюдает POSIX.
>  >>
>  >>  > Последнее на первый взгляд звучит как чушь.  Можно источник?
>  >>
>  >> bash
>
>  > И пара примеров, конечно, без труда найдется (в позиксном режиме,
>  > который при запуске за «sh», разумеется)?
>
> Сходу нет. Он слишком крив для того, чтобы я им пользовался. Что самое
> неприятное, ВНЕЗАПНО крив.

Ну а на это-то заявление пара примеров найдется сходу?

> Но в принципе, уже достаточно полистать историю правок к скриптам
> пакетов в дебиане за период, когда шла волна борьбы за работу скриптов в
> dash. То и дело всплывала вычистка башизмов из скриптов, начинающихся на
> #!/bin/sh.

Простите, а это здесь каким боком?



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

2016-12-01 Пенетрантность Artem Chuprina
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 в качестве разделителя в скрипте

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

И пара примеров, конечно, без труда найдется (в позиксном режиме, который при 
запуске за «sh», разумеется)?



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

2016-12-01 Пенетрантность Artem Chuprina
Dmitry Alexandrov -> debian-russian@lists.debian.org  @ Thu, 01 Dec 2016 
03:11:10 +0300:

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

 > Последнее на первый взгляд звучит как чушь.  Можно источник?

bash



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

2016-12-01 Пенетрантность Михаил Касаджиков
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 в качестве разделителя в скрипте

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

Последнее на первый взгляд звучит как чушь.  Можно источник?



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

2016-11-30 Пенетрантность Artem Chuprina
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.



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

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

-- 
WBR, Andrey Tataranovich