LINUX.ORG.RU

Несоответствие мануала действительности

 


0

2

Прочитал манул, полез в файл parse.y в исходниках и понял что мануал не соответсвует тому как работает баш. Множество синтаксических конктрукций не задокументировано, а некоторые задокументированы неправильно.

Например:

for name; { echo $name; }

в мануеле нет констнукции for без do, тем неменее в баше есть несколько вариантов таких конструкций

также в while/until ; опциональна, хотя в мануле написано что нет



Последнее исправление: hobbit (всего исправлений: 3)
Ответ на: комментарий от cobold

недекларированную возможность

Да, хоть горшком назови, только в печь не сажай. У многих программ есть опции командной строк, не описаные в man. У одних для внутреннего использования, у других сначала опцию называют «depricated», потом выкидывают из man, а в коде оставляют.

Здесь https://unix.stackexchange.com/questions/306940/what-is-the-purpose-of-the-do... написано, что zsh понимает:

for i { echo "$i"; }
хотя в его документации https://zsh.sourceforge.io/Doc/Release/Shell-Grammar.html написано, что обязательно ";" или перевод строки. У меня нет zsh, не проверял.

В руководстве https://gnu.org/software/bash/manual/bash.html написано, что bash в продолжение sh из SRV4.2, перечислены отличия. Значит, нужно сначал прочитать тот докумет, только потом man bash :)

Пишут, что и в документации System III были пробелы в описании этой «краткой» формы for и while

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

I’m told by the maintainer of bash that this is an undocumented feature that provides backwards compatibility

Тогда нужно пытать мантейнера, почему они выборочно реализовали недокументированые фичи. Допустим, в оригинальном Bourne-шелах можно было вместо палки (|) ставить домик (^) https://www.in-ulm.de/~mascheck/bourne/common.html

Непонятна позиция разработчиков — им лень документировать или они планируют в дальнейшем выкинуть такой синтаксис и сознательно не документруют.

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

Это святые люди, которые преодолевая тошноту и отвращение держат этот слипшийся ком из костылей и велосипедов. И памятник поставить нужно, а не пытать!

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

For historical reasons, open and close braces may be used instead of do and done (e.g., for i; { echo $i; }).

Прикольно!

Если будете его использовать, то в какой-то момент ваши скрипты превратятся в тыкву.

А может так и оставят навсегда. for в стиле C же с брейсам идёт, так пуркуа бы и не па для остальных?!

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

Прикольно!

Ваша страсть к bash пугает :)

А может так и оставят навсегда.

Может, позиция разработчиков непонятна. С одной стороны на их форуме я нашёл такое изречение:

Bash's parser is unique among widely-used POSIX shells because it uses bison/yacc. Everyone else uses a hand-rolled recursive descent parser.

One of the POSIX group's greatest achievements was to create a yacc-like grammar for the shell, since, as Tom Duff put it, «Nobody really knows what the Bourne shell's grammar is.» And even that has lots of special cases and context-dependent rules."

Возможно, они уже действительно убедились, что «некто на самом деле не знает грамматику Борн-шелла» и стараются не трогать. Но, с другой стороны, в версии 5.0 было:

$$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, word_lineno[word_top]);
if (word_top > 0) word_top--;
А в 5.3 стало:
int l;
l = (compoundcmd_top > 0) ? compoundcmd_lineno[compoundcmd_top - 1].lineno
                          : compoundcmd_lineno[compoundcmd_top].lineno;
$$ = make_for_command ($2, add_string_to_list ("\"$@\"", (WORD_LIST *)NULL), $5, l);
if (compoundcmd_top >= 0) compoundcmd_top--;  /* RBRACE */
if (compoundcmd_top >= 0) compoundcmd_top--;  /* FOR */
Это код обработки for с фигурными скобками. То есть кто-то заморчился и что-то починил, а мог бы просто удалить недокументированную возможность.

До этого, в это место кода лазили году в 2001, версия 2.05a, когда чинили for i in ; do. Древний bash обязательно после in хотел хоть одно слово, иначе ругался.

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

Ваша страсть к bash пугает :)

Я не профессионал, так что навредить смогу только самому себе 😁

На самом деле баш просто обязан вызывать интерес у линуксоида по целому ряду причин типа: его все ругают, на нём много пишут и он начинает приносить пользу с первых же страниц первой книги про баш.

С другой стороны, нафига мне язык общего назначения или какой-то посторонний, когда командная строка вот она и так будет ещё многие-многие годы, а может и навсегда, пока жива вся эта тема с линукс и/или гну.

papin-aziat ★★★★★
()