Dove sono le continuazioni della riga bash dopo && e || documentata?


28

Ho visto molto questo costrutto negli script e l'ho usato da solo, ma mi dà fastidio che non riesco a trovarlo nella documentazione.

Esempio:

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

Questo potrebbe essere fatto anche con barre rovesciate prima delle newline, come menzionato in 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).

Esempio:

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

... ma questo non sembra essere necessario. La prima versione sopra funziona anche senza le barre rovesciate.

Dove posso trovarlo man bash? (Inoltre, questo è bashspecifico o conforme a POSIX?)


Se stai cercando bash ufficiale o documentazione POSIX, vedi la risposta di Gilles. Ma questo è discusso in Quali sono gli operatori di controllo e reindirizzamento della shell? - Ulteriori osservazioni sulla ;, &, (e) .
G-Man dice 'Reinstate Monica' il

@ G-Man, immagino che non fosse diretto a me? Solo per i futuri lettori? Come ho detto nella domanda, "mi dà fastidio che non riesco a trovarlo nella documentazione". Sapevo già come funziona, quindi questa era davvero solo una richiesta per la documentazione ufficiale. :)
Wildcard

Anche nel caso di array, v'è una continuazione di riga implicita: names=( Rama Soma<newline> Sita Diya ). Python li descrive chiaramente qui, ma la documentazione di Bash non sembra.
Jamadagni,

Risposte:


39

Una nuova riga viene ignorata in alcuni contesti in cui è manifestamente un comando non terminato. Questi contesti includono dopo un operatore di controllo ( &&, ||, |, &, ;, ;;, ma non !).

Non lo vedo documentato nel manuale di Bash.

In POSIX, è specificato tramite le regole grammaticali . Ovunque abbiano le regole linebreak, puoi avere zero o più interruzioni di riga.


+1, non sapevo che funzionasse per la semplice pipe (|). Vorrei che potessimo anche metterli sulla riga successiva, per leggibilità, ma non funziona in questo modo (in tal caso, è necessario spostare la nuova riga precedente).
Olivier Dulac il

1
@OlivierDulac Come potrebbe funzionare? Durante l'elaborazione della riga di comando corrente, come dovrebbe sapere che stai pianificando di digitare |all'inizio della riga successiva? Ricorda, la shell viene anche utilizzata in modo interattivo, non solo negli script, e la grammatica è la stessa.
Barmar,

@Barmar: lo so, lo so (ha scritto compilatori a scuola ^^) ... Ho detto "Vorrei", e non è un desiderio molto plausibile
Olivier Dulac,

1
@DocSalvager, puoi fare un esempio di un bug logico che potrebbe aiutare a prevenire? Ho difficoltà a vederlo ...
Wildcard

2
@DocSalvager, in realtà non avrei usato il codice mentre lo scrivevo: era un'illustrazione. Senza l'ultima riga (la clausola else) la userei in questo modo, però. (Per "se questo e questo poi lo fanno" this && this2 && thatva bene, ma per una elseclausola userei un vero if then else fi.)
Wildcard
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.