LINUX.ORG.RU

Bash и Dash

 ,


0

2
alex@thinkl13:/tmp$ bash ./test.sh a\\\\"b c" d e
./test.sh
a\\b c
d
e

alex@thinkl13:/tmp$ dash ./test.sh a\\\\"b c" d e
./test.sh
a\b c
d
e

Господа, а что это за беспредел? Почему это кривое поделие стоит по умолчанию, если оно даже не может аргументы распарсить?

★★★★★

Ответ на: комментарий от PPP328

Dash конечно же

Значит это про дебиан. Всегда переопределял шелл в дебиане. Раньше даш выпиливался, теперь жестко прибит.

Это не самое страшное в дебиане, но подбешивает, да.

utanho ★★★★★
()
Ответ на: комментарий от teod0r
alex@thinkl13:/tmp$ cat ./test.sh 
#!/bin/sh

echo "$0"
echo "$1"
echo "$2"
echo "$3"
echo "$4"
alex@thinkl13:/tmp$ dash ./test.sh a\\\\"b c" d e
./test.sh
a\b c
d
e

alex@thinkl13:/tmp$ bash ./test.sh a\\\\"b c" d e
./test.sh
a\\b c
d
e

Всё равно dash выводит какой-то нерелевантный бред

PPP328 ★★★★★
() автор топика

По умолчанию bash не является POSIX-совместимой оболочкой. POSIX требует echo раскрывать свои аргументы. Чтобы bash делал так же, запускай его так:

bash --posix -O xpg_echo ./test.sh a\\\\"b c" d e

---posix включает большинство опций совместимости с POSIX, но не все. Как раз xpg_echo и не включается, а она обеспечивает совместимость команды echo.

TeopeTuK ★★★★
()
Ответ на: комментарий от TeopeTuK

Так проблема не в баш, в нём всё хорошо. Проблема в dash. У него откуда-то появляется нечетная скобка.

Как будто dash проводит какую-то лишнюю итерацию и \\\\ превращается сначала в \\ (где баш останавливается), а потом в \

PPP328 ★★★★★
() автор топика
Последнее исправление: PPP328 (всего исправлений: 2)
Ответ на: комментарий от TeopeTuK

Смотрю https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html, можешь ткнуть пальцем где конкретно это сказано?

Потому что (a)sh в FreeBSD тоже не делает expand, хочу понять баг или нет (задекларирована POSIX совместимость).

yuripv79
()
Ответ на: комментарий от yuripv79

Это не свойство оболочки, а свойство echo: https://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html#tag_20_37 (раздел Operands). Опцию xpg_echo и пояснение про совместимость с POSIX я видел в документации к bash здесь: https://www.gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html (в самом конце).

TeopeTuK ★★★★
()
Ответ на: комментарий от TeopeTuK

Но тут же речь, скорей всего, про builtin echo, раз результаты зависят от оболочки?

Вообще странно, вот это говорит, что должно backslash sequences распозновать:

[XSI] [Option Start] X/Open System Interfaces [Option End]
The functionality described is part of the X/Open Systems Interfaces option. Functionality marked XSI is an extension to the ISO C standard. Application developers may confidently make use of such extensions on all systems supporting the X/Open System Interfaces option.

echo(1):

STANDARDS
     The echo utility conforms to IEEE Std 1003.1-2001 (“POSIX.1”) as amended
     by Cor. 1-2002.

…но:

$ /bin/echo '\\'
\\

Видимо XSI это еще что-то сверху или сбоку от стандарта :)

zsh builtin:

$ echo '\\'
\

Стало еще непонятней, где правда и кто виноват.

yuripv79
()
Ответ на: комментарий от yuripv79

Видимо XSI это еще что-то сверху или сбоку от стандарта :)

Тот, который GNU, в мане пишет так:

       -e     enable interpretation of backslash escapes

       -E     disable interpretation of backslash escapes (default)
monk ★★★★★
()
Ответ на: комментарий от yuripv79

Видимо XSI это еще что-то сверху или сбоку от стандарта :)

Нет, XSI - это ещё один из стандартов. Их много. POSIX просто самый известный.

А конкретно насчёт echo - он в каждой системе ведёт себя по-своему, об этом даже написано в его мане и рекомендуют использовать для переносимости printf вместо него. Но мне что-то кажется что на некоторых старых системах printf вообще может не оказаться, а вот echo, хоть какой-то, есть везде (даже в DOS-е).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 4)
Ответ на: комментарий от iron

Вот под FreeBSD:

$ csh ./test.sh a\\\\«b c» d e

$ sh ./test.sh a\\\\«b c» d e

$ bash ./test.sh a\\\\«b c» d e

это был copy-paste или авторский пересказ ?

если первое, то пользователи FreeBSD сильно упали в моих глазах :-) потому-что первую скрипку сыграет неуказанный системный шел. Это он готовит аргументы для csh,sh,bash а они потом ещё раз их переварят.

для чистоты опыта скрипт test.sh стоит заменить на аналог C чтобы не зависить от шебанга и симлинка /bin/sh->?? и кто там объявлен $SHELL ,а просто печатать argv[n++]

то есть тест не убедителен. Каждую из строк надо выпинихивать в отдельный файл 1.sh 2.csh 3.bash, и их запускать отдельными интерпретаторами. Иначе это про камасутру - параметры потрогают и перетрахают все

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

неуказанный системный шел

Очень даже указанный - /bin/sh. У /bin/csh был бы промпт %, у баша - с текущим путём перед $, а другие шеллы в фрибсд не принято использовать (да и баш обычно используют только выходцы из линукса).

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

Как уже было сказано выше, «это не свойство оболочки, а свойство echo». При передаче аргументов обычным внешним командам (не встроенным) все отрабатывает прозрачно. Чтобы продемонстрировать это, сформируйте файлик test2.sh:

bash -c 'echo a\\\\b'
sh   -c 'echo a\\\\b'

и выполните его через bash и dash. Выхлоп будет идентичным:

$ bash test2.sh
a\\b
a\b
$ sh   tes2.sh
a\\b
a\b

Ну а то, что встроенные директивы в разных shell-ах имеют свои особенности - так это не возбраняется. Хотя, конечно, до этих «особенностей» не всегда быстро докопаешься и можно залететь ))

vinvlad ★★
()