Die kurze Antwort lautet : <
, >
und ihre Varianten haben die höchste Bindungspriorität (engste Bindung), gefolgt von |
, gefolgt von &&
und ||
, gefolgt von ;
und &
. Also wird nur das echo "Thumbnail creation failed"
in die geleitet tee
.
Eine etwas längere Antwort würde darauf hinweisen, dass die höchste Priorität tatsächlich die Gruppierung ist, die mit Klammern oder Klammern angegeben werden kann. Zum Beispiel,
A && (B; C)
und
A && { B; C;}
sind ungefähr gleichbedeutend mit
if A
then
B
C
fi
Anmerkungen:
- Die Klammern geben Ihnen eine Unterschale; dh Befehle
B
und C
in einem untergeordneten Prozess ausführen . Befehle wie Variablenzuweisungen oder cd
haben daher keine Auswirkung auf die übergeordnete Shell. Befehle in geschweiften Klammern werden im selben Prozess wie der A
Befehl ausgeführt. Daher ist das Klammerkonstrukt A && { B; C;}
näher am if
- then
- else
Konstrukt.
- In der Klammer-Syntax muss vor dem
{
und ein ;
(oder ein &
oder eine neue Zeile) vor dem ein Leerzeichen stehen }
.
Weitere Informationen finden Sie unter Was sind die Steuerungs- und Umleitungsoperatoren der Shell? und wann ist 'wenn' nicht notwendig? (besonders meine Antworten).
Für noch weitere Lektüre finden Sie die bash (1) man - Seite und
die POSIX - Spezifikation / Definition der Shell Command Language , insbesondere Abschnitt 2.9, Shell - Befehle
und Abschnitt 2.10.2, Shell Grammatikregeln . Dies ist ein Versuch, einen Kontext für das oben Gesagte bereitzustellen:
sind "Pipelines". Die Grammatik legt Bausteine fest und baut darauf auf, wie es für formale Grammatiken wie diese (und für Programmiersprachen wie C) typisch ist. Daher wird ein einzelner „einfacher Befehl“ als „Pipeline“ betrachtet, obwohl er keine enthält ein Rohr. Es ist nicht (semantisch) sinnvoll, dass eine Variablenzuweisung Bestandteil einer Pipeline ist, aber Dinge wie
x=1 | od -ab
oder
ls -laR | z=0
sind syntaktisch gültig.
Dinge wiePipeline 1 && Pipeline 2 || Pipeline 3
werden von bash als "Listen" und von POSIX als "UND-ODER-Listen" bezeichnet. Auch hier wird eine einzelne "Pipeline" oder sogar ein einzelner "einfacher Befehl" als "UND-ODER-Liste" betrachtet, obwohl sie kein UND oder ODER enthält.
Wenn Sie zu Dingen wie kommenUND-ODER-Liste 1 & UND-ODER-Liste 2 ; UND-ODER-Liste 3
Die Nomenklatur wird etwas inkonsistent. Bash nennt diese "Listen" auch; POSIX nennt sie "Listen", "zusammengesetzte Listen" und (selten) "Begriffe". Auch hier wird eine einzelne "UND-ODER-Liste", "Pipeline" oder sogar ein einzelner "einfacher Befehl" als "Liste" betrachtet, obwohl sie kein &
oder ein enthält ;
.
Dinge wie( zusammengesetzte_Liste )
und
{ zusammengesetzte_Liste ;}
und die Strömungssteuerbefehle ( for
, if
- then
- else
, while
, etc.) werden als „Verbindung - Befehle“ bezeichnet.
In den obigen Beispielen, ist es wahrscheinlich der am meisten Sinn zu interpretieren A
, B
und C
Pipelines zu sein. Denken Sie daran, dass eine „Pipeline“ ein einzelner „einfacher Befehl“ sein kann. Es muss kein Rohr enthalten.
{
...}
sollte funktionieren. Ich habe es möglicherweise unsystematisch versucht und nicht die erwarteten Ergebnisse erzielt.