Lo scenario classico con Operator Precedence, hai una linea come:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
E non sai se è analizzato ((A && B) | C)o (A && B | C)...
La documentazione quasi ufficiale trovata qui non elenca la pipe nell'elenco quindi non posso semplicemente controllare nella tabella.
Inoltre, in bash, (non è solo per cambiare l'ordine delle operazioni, ma crea una subshell , quindi non sono sicuro al 100% che questa riga sia l'equivalente della riga precedente:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
Più in generale, come conoscere l' AST di una linea bash? In Python ho una funzione che mi dà l'albero in modo da poter facilmente ricontrollare l'ordine di funzionamento.
bashsta usando un parser yacc non qualcosa di ad hoc; se lo attraversi yacc -vti fornirà y.outputuna bella grammatica che mostra quello &&e ||combina gli elenchi e gli elenchi alla fine sono costituiti da pipeline (e non viceversa); tl; dr; A && B | Cè uguale a A && { B | C; }, come previsto. Non assumere alcun ordine di esecuzione tra Be C; i comandi in una pipeline vengono eseguiti in parallelo .
[...]test e delle $((...))valutazioni aritmetiche; in particolare, ||e &&come usato con l'elenco dei comandi nel linguaggio shell hanno la stessa precedenza , a differenza dei rispettivi operatori nella Co nella valutazione aritmetica (dove si &&lega più strettamente di ||).
|è solo un connettore che adatta lo stdout LHS allo stdin RHS. Quindi se ilcdcomando nel tuo esempio fallisce, non invierebbe alcun outputhead, maheadin realtà continuerebbe aexecuteanalizzare il nulla e non restituirà alcun output.