Im klassischen Szenario mit Operator-Rangfolge haben Sie eine Zeile wie:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
Und Sie wissen nicht, ob es analysiert ((A && B) | C)
oder (A && B | C)
...
Die fast offizielle Dokumentation, die hier zu finden ist, listet die Pipe nicht in der Liste auf, so dass ich nicht einfach in der Tabelle nachschauen kann.
Darüber hinaus dient Bash (
nicht nur zum Ändern der Reihenfolge von Vorgängen, sondern erstellt auch eine Subshell. Daher bin ich mir nicht zu 100% sicher, ob diese Zeile der vorherigen Zeile entspricht:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Wie kann man allgemein den AST einer Bash-Linie ermitteln? In Python habe ich eine Funktion, die mir den Baum gibt, so dass ich die Reihenfolge der Operationen leicht überprüfen kann.
bash
verwendet ein Yacc- Parser keine Ad-hoc-Sache; Wenn Sie das durchgehen yacc -v
, erhalten Sie y.output
eine nette Grammatik, die das zeigt &&
und ||
Listen kombiniert, und Listen bestehen schließlich aus Pipelines (und nicht umgekehrt); tl; dr; A && B | C
ist das gleiche wie A && { B | C; }
, wie erwartet. Nehmen Sie keine Ausführungsreihenfolge zwischen B
und an C
. Die Befehle in einer Pipeline werden parallel ausgeführt .
[...]
Tests und $((...))
arithmetischen Auswertungen verwendet werden. Insbesondere ||
und &&
wie bei Befehlslisten in der Shell-Sprache verwendet, haben sie den gleichen Vorrang , im Gegensatz zu den jeweiligen Operatoren in C
oder bei der arithmetischen Auswertung (wo &&
enger gebunden wird als ||
).
|
es sich nur um einen Anschluss handelt, der den LHS-Standard an den RHS-Standard anpasst. Also , wenn dercd
Befehl in Ihrem Beispiel fehlschlägt, würde es keinen Ausgang sendenhead
, aberhead
immer noch in der Tat würdeexecute
, analysiert das nichts, und keine Ausgabe zurück.