Где продолжение строки bash после && и || документально?


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

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

Я не вижу этого в руководстве по bash.

В POSIX это определяется с помощью правил грамматики . Везде, где есть правила linebreak, вы можете иметь ноль или более разрывов строк.


+1, я не знал, что это сработало для простой трубы (|). Хотелось бы, чтобы мы также поместили их в следующую строку для удобства чтения, но это не сработает таким образом (если вы делаете это, вам нужно пробелить предыдущий символ новой строки).
Оливье Дюлак

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

@ Бармар: Я знаю, я знаю это (писал компилятор в школе ^^) ... Я сказал «Я хочу», и это не очень правдоподобное желание
Оливье Дюлак

1
@DocSalvager, не могли бы вы привести пример логической ошибки, которую можно предотвратить? Мне трудно это видеть ...
Wildcard

2
@DocSalvager, я бы на самом деле не использовал код, как я его написал, - это была иллюстрация. Хотя без последней строки (предложение else) я бы использовал его таким образом. (Для «если это и это, то сделай то» this && this2 && thatэто хорошо, но для elseпредложения я бы использовал фактический if then else fi.)
Wildcard
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.