Wo sind Bash-Linien-Fortsetzungen nach && und || dokumentiert?

28

Ich habe dieses Konstrukt häufig in Skripten gesehen und selbst verwendet, aber es stört mich, dass ich es nicht in der Dokumentation zu finden scheint.

Beispiel:

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

Dies könnte auch mit Backslashes vor den Zeilenumbrüchen geschehen, wie 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).

Beispiel:

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

... aber das scheint nicht nötig zu sein. Die erste Version oben funktioniert auch ohne die Backslashes.

Wo finde ich das man bash? (Ist dies auch bashspezifisch oder POSIX-konform?)

Platzhalter
quelle
Wenn Sie nach offizieller Bash- oder POSIX-Dokumentation suchen, lesen Sie die Antwort von Gilles. Dies wird jedoch in Was sind die Steuerungs- und Umleitungsoperatoren der Shell? - Weitere Beobachtungen auf ;, &, (und) .
G-Man sagt, dass Monica
@ G-Man, ich denke, das war nicht an mich gerichtet? Nur für zukünftige Leser? Wie ich in der Frage sagte, "stört es mich, dass ich es nicht in der Dokumentation zu finden scheinen." Ich wusste bereits, wie es funktioniert, also war dies in der Tat nur eine Anfrage für die offizielle Dokumentation. :)
Wildcard
Selbst im Falle von Arrays, gibt es eine implizite Zeilenfortsetzung: names=( Rama Soma<newline> Sita Diya ). Python beschreibt diese hier klar , aber die Bash-Dokumentation scheint dies nicht zu tun.
Jamadagni

Antworten:

39

Eine neue Zeile wird in einigen Kontexten ignoriert, in denen offensichtlich ein nicht abgeschlossener Befehl vorhanden ist. Diese Kontexte umfassen , nachdem ein Steueroperator ( &&, ||, |, &, ;, ;;, aber nicht !).

Ich sehe dies nicht im Bash-Handbuch dokumentiert.

In POSIX wird dies über die Grammatikregeln festgelegt . Überall dort linebreak, wo die Regeln gelten , können keine oder mehrere Zeilenumbrüche auftreten.

Gilles 'SO - hör auf böse zu sein'
quelle
+1, ich wusste nicht, dass es für die einfache Pipe (|) funktioniert. Ich wünschte, wir könnten sie aus Gründen der Lesbarkeit auch in die nächste Zeile setzen, aber das funktioniert nicht so (wenn Sie das tun, müssen Sie die vorhergehende Zeile mit einem Leerzeichen versehen).
Olivier Dulac
1
@OlivierDulac Wie könnte das evtl. funktionieren? Woher soll bei der Verarbeitung der aktuellen Befehlszeile bekannt sein, dass die Eingabe |am Anfang der nächsten Zeile erfolgen soll? Denken Sie daran, dass die Shell nicht nur in Skripten, sondern auch interaktiv verwendet wird und die Grammatik dieselbe ist.
Barmar
@Barmar: Ich weiß, ich weiß das (schrieb Compiler in der Schule ^^) ... Ich sagte "Ich wünschte", und es ist kein sehr plausibler Wunsch
Olivier Dulac
1
@DocSalvager, können Sie ein Beispiel für einen Logikfehler nennen, der dazu beitragen würde, dies zu verhindern? Es fällt mir schwer, das zu sehen ...
Wildcard
2
@DocSalvager, ich würde den Code nicht verwenden, wie ich ihn geschrieben habe - es war eine Illustration. Ohne die letzte Zeile (die else-Klausel) würde ich es allerdings so verwenden. (Für "Wenn dies und das dann mach das" this && this2 && thatist in Ordnung, aber für eine elseKlausel würde ich ein tatsächliches verwenden if then else fi.)
Wildcard