La risposta breve è che <, >e le loro varianti hanno la precedenza di legame più alta (legame più stretto), seguita da |, seguita da &&e ||, seguita da ;e &. Quindi, solo il echo "Thumbnail creation failed"viene convogliato nel file tee.
Una risposta leggermente più lunga indica che la precedenza più elevata è in realtà il raggruppamento, che può essere indicato tra parentesi o parentesi graffe. Per esempio,
A && (B; C)
e
A && { B; C;}
sono approssimativamente equivalenti a
if A
then
B
C
fi
Appunti:
- Le parentesi ti danno una subshell; cioè, comanda
Bed Cesegue in un processo figlio. Pertanto, comandi come assegnazioni di variabili o cd
non avranno alcun effetto sulla shell padre. I comandi tra parentesi graffe vengono eseguiti nello stesso processo del Acomando. Pertanto, il costrutto parentesi graffa A && { B; C;}è più vicino al costrutto if- then- else.
- Nella sintassi del controvento, ci deve essere uno spazio dopo
{e e ;(o a &, o newline) prima di }.
Per ulteriori letture, vedere Quali sono gli operatori di controllo e reindirizzamento della shell? e quando è 'se' non necessario? (in particolare le mie risposte).
Per ancora più approfondimenti, vedere la (1) la pagina man di bash e
POSIX specifica / definizione del Command Language Shell , in particolare Sezione 2.9, comandi della shell
e la Sezione 2.10.2, Shell regole grammaticali . Questo è un tentativo di fornire un contesto per quanto sopra:
sono "condotte". La grammatica stabilisce blocchi e si basa su di essi, come è tipico per le grammatiche formali come questa (e per i linguaggi di programmazione come C), quindi un singolo "comando semplice" è considerato una "pipeline", anche se non contiene una pipa. Non ha senso (semantico) che un'assegnazione variabile sia un componente di una pipeline, ma cose come
x=1 | od -abo
ls -laR | z=0sono sintatticamente valide.
Cose comepipeline 1 && pipeline 2 || pipeline 3
sono chiamati "elenchi" da bash e "elenchi AND-OR" da POSIX. Ancora una volta, una singola "pipeline" o anche un singolo "comando semplice" è considerato un "elenco AND-OR", anche se non contiene un AND o un OR.
Quando arrivi a cose del genereElenco AND-OR 1 e elenco AND-OR 2 ; Elenco AND-OR 3
la nomenclatura inizia a diventare un po 'incoerente. Bash chiama anche questi "elenchi"; POSIX li chiama "elenchi", "elenchi composti" e (raramente) "termini". Ancora una volta, un singolo "elenco AND-OR", "pipeline" o anche un singolo "comando semplice" è considerato un "elenco", anche se non contiene a &o a ;.
Cose come( compound_list )
e
{ compound_list ;}ei comandi di controllo di flusso ( for, if- then- else, whileecc) sono chiamate “comandi composti”.
Negli esempi sopra riportati, rende probabilmente più senso per interpretare A, Be Cdi essere condotte. Ricorda, una "pipeline" può essere un singolo "comando semplice"; non deve contenere una pipe.
{...}dovrebbe funzionare. Avrei potuto provarlo in modo non sistematico e non ottenere i risultati previsti.