Де продовження лінії баш після && та || задокументовано?


28

Я бачив цю конструкцію в сценаріях багато і сам її використовував, але мені непокоїть, що я не можу знайти її в документації.

Приклад:

[ -f file1 ] &&
[ -f file2 ] &&
echo "Both files exist." ||
echo "One or the other file doesn't exist."

Це також можна зробити з відхиленнями від рядків перед новими рядками, як зазначено в man bash:

If a \<newline> pair appears,  and  the  backslash  is  not
itself  quoted,  the \<newline> is treated as a line continuation (that
is, it is removed from the input stream and effectively ignored).

Приклад:

[ -f file1 ] && \
[ -f file2 ] && \
echo "Both files exist." || \
echo "One or the other file doesn't exist."

... але це здається не потрібним. Перша версія вище працює навіть без зворотних нахилів.

Де я можу це знайти man bash? (Також, це bashспецифічна чи POSIX сумісна?)


Якщо ви шукаєте офіційну документацію bash або POSIX, дивіться відповідь Гілла. Але це обговорюється в розділі Що таке оператори контролю та перенаправлення оболонки? - Ще зауваження по ;, &, (і) .
G-Man каже: "Відновіть Моніку"

@ G-Man, я думаю, це не було спрямовано на мене? Просто для майбутніх читачів? Як я вже говорив у запитанні, "це турбує мене, що я не можу знайти його в документації". Я вже знав, як це працює, тому це справді був лише запит на офіційну документацію. :)
Wildcard

Навіть в разі масивів, є неявне продовження рядка: names=( Rama Soma<newline> Sita Diya ). Python чітко описує це тут, але, здається, документація на Bash.
джамадагні

Відповіді:


39

Новий рядок ігнорується в декількох контекстах, де явно є неперервана команда. Ці контексти включають в себе після того, як оператор управління ( &&, ||, |, &, ;, ;;, але не !).

Я не бачу цього документально підтвердженим у посібнику "Баш".

У POSIX він задається через граматичні правила . Де б не були правила linebreak, ви можете мати нульовий або більше розривів рядків.


+1, я не знав, що це працює для простої труби (|). Я б хотів, щоб ми могли також поставити їх на наступний рядок, для читабельності, але це не працює таким чином (якщо це зробити, вам потрібно усунути попередній новий рядок).
Олів’є Дулак

1
@OlivierDulac Як це могло працювати? Коли він обробляє поточний командний рядок, як слід знати, що ви плануєте вводити |на початку наступного рядка? Пам'ятайте, оболонка також використовується в інтерактивному режимі, а не тільки в сценаріях, і граматика однакова.
Бармар

@Barmar: Я знаю, я це знаю (писали укладачі в школі ^^) ... Я сказав "я бажаю", і це не дуже правдоподібне бажання
Олів'є Дулак

1
@DocSalvager, чи можете ви навести приклад логічної помилки, яка допоможе запобігти? Мені важко це бачити ....
Wildcard

2
@DocSalvager, я б фактично не використовував код так, як написав його - це була ілюстрація. Без останнього рядка (інше застереження) я би використовував його таким чином. (Бо "якщо це і це, то зроби це", this && this2 && thatце добре, але для elseпункту я використовую фактичне if then else fi.)
Wildcard
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.