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
B
e C
executados 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 A
comando. 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 -ab
ou
ls -laR | z=0
sã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
, B
e C
para 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.