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
Bund Cin 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 ABefehl ausgeführt. Daher ist das Klammerkonstrukt A && { B; C;}näher am if- then- elseKonstrukt.
- 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 -aboder
ls -laR | z=0sind 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, Bund CPipelines 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.