A resposta é que <, >e suas variantes têm a prioridade mais alta de ligação (ligação mais apertada), seguido por |, seguido por &&e ||, seguida de ;e &. Portanto, apenas o echo "Thumbnail creation failed"é canalizado para o tee.
Uma resposta um pouco mais longa indicaria que a maior precedência é realmente o agrupamento, que pode ser indicado entre parênteses ou chaves. Por exemplo,
A && (B; C)
e
A && { B; C;}
são aproximadamente equivalentes a
if A
then
B
C
fi
Notas:
- Os parênteses fornecem um subshell; ou seja, comandos
Be Cexecutados em um processo filho. Portanto, comandos como atribuições de variáveis ou cd
não terão efeito no shell pai. Os comandos entre chaves são executados no mesmo processo que o Acomando. Portanto, a construção entre chaves A && { B; C;}está mais próxima da construção if- then- else.
- Na sintaxe do colchete, deve haver um espaço após ae
{uma ;(ou a &ou nova linha) antes da }.
Para uma leitura mais detalhada, consulte Quais são os operadores de controle e redirecionamento do shell? e Quando o 'se' não é necessário? (particularmente minhas respostas).
Para uma leitura ainda mais detalhada, consulte a página do manual bash (1) e
a especificação / definição POSIX da Linguagem de Comando do Shell , especificamente a Seção 2.9, Comandos do Shell
e a Seção 2.10.2, Regras gramaticais da Shell . Esta é uma tentativa de fornecer algum contexto para o acima exposto:
são "gasodutos". A gramática estabelece blocos de construção e constrói sobre eles, como é típico para gramáticas formais como esta (e para linguagens de programação como C), de modo que um "comando simples" individual é considerado um "pipeline", mesmo que não contenha um cano. Não faz sentido (semântico) que uma atribuição de variável seja um componente de um pipeline, mas coisas como
x=1 | od -abou
ls -laR | z=0são sintaticamente válidas.
Coisas comogasoduto 1 e & gasoduto 2 || gasoduto 3
são chamados de "listas" pelo bash e "AND-OR lists" pelo POSIX. Novamente, um "pipeline" individual ou mesmo um "comando simples" individual é considerado uma "lista AND-OR", mesmo que não contenha um AND ou um OR.
Quando você chega a coisas comoLista AND-OR 1 e lista AND-OR 2 ; Lista AND-OR 3
a nomenclatura começa a ficar um pouco inconsistente. Bash chama essas "listas" também; O POSIX os chama de "listas", "listas compostas" e (raramente) "termos". Novamente, uma "lista E-OU" individual, "pipeline" ou mesmo um "comando simples" individual é considerado uma "lista", mesmo que não contenha a &ou a ;.
Coisas como( lista_composta )
e
{ lista_composta ;}e os comandos de controlo de fluxo ( for, if- then- else, while, etc.) são chamados “compostos” comandos.
Nos exemplos acima, provavelmente faz mais sentido para interpretar A, Be Cpara ser condutas. Lembre-se, um "pipeline" pode ser um "comando simples" individual; não precisa conter um cano.
{...}deveria funcionar. Eu poderia ter tentado sistematicamente e não obtive os resultados esperados.