O cenário clássico com Precedência do Operador, você tem uma linha como:
(cd ~/screenshots/ && ls screenshot* | head -n 5)
E você não sabe se é analisado ((A && B) | C)ou (A && B | C)...
A documentação quase oficial encontrada aqui não lista o canal na lista, portanto não posso simplesmente verificar a tabela.
Além disso, no bash, (não é apenas para alterar a ordem das operações, mas cria um subshell , por isso não tenho 100% de certeza de que essas linhas sejam equivalentes à linha anterior:
((cd ~/screenshots/ && ls screenshot*) | head -n 5)
De maneira mais geral, como conhecer o AST de uma linha de base? Em python, eu tenho uma função que me fornece a árvore, para que eu possa verificar com facilidade a ordem de operação.
bashestá usando um analisador yacc e não algo ad-hoc; se você passar por yacc -visso, fornecerá y.outputuma boa gramática que mostra isso &&e ||combina listas, e as listas acabam sendo compostas de pipelines (e não o contrário); tl; dr; A && B | Cé o mesmo que A && { B | C; }, como esperado. Não assuma nenhuma ordem de execução entre Be C; os comandos em um pipeline são executados em paralelo .
[...]testes e $((...))avaliações aritméticas; em particular, ||e &&conforme usado com a lista de comandos na linguagem shell, tem a mesma precedência , diferentemente dos respectivos operadores na Cou na avaliação aritmética (onde &&se vincula mais firmemente que ||).
|útil saber que é apenas um conector que encaixa o stdout do LHS no stdin do RHS. Portanto, se ocdcomando no seu exemplo falhar, ele não enviará nenhuma saída parahead, masheadainda assimexecute, analisará o nada e não retornará nenhuma saída.