A resposta curta é que < , > e suas variantes
tem a maior precedência de ligação (ligação mais estreita),
seguido por | , seguido por && e || , seguido por ; e & .
Portanto, somente o echo "Thumbnail creation failed" é canalizado para o tee .
Uma resposta um pouco mais longa indicaria que a precedência mais alta está realmente agrupando, o que pode ser indicado com 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 dão uma subchave;
isto é, os comandos
BeCsão executados em um processo filho. Assim sendo, comandos como atribuições de variáveis oucdnão terá efeito no shell pai. Os comandos entre chaves são executados no mesmo processo que o comandoA. Portanto, a construção da chaveA && { B; C;}está mais próxima da construçãoif-then-else. - Na sintaxe de chave,
deve ser um espaço depois de
{e;(ou&ou newline) antes do}.
Para ler mais, consulte Quais são os operadores de controle e redirecionamento do shell? e Quando é 'se' não é necessário? (particularmente minhas respostas).
Para ainda mais ler mais, veja o bash (1) página de manual e a especificação POSIX / definição da Linguagem de Comandos Shell , especificamente Seção 2.9, Comandos da Shell e Seção 2.10.2, Regras gramaticais de shell . Esta é uma tentativa de fornecer algum contexto para o acima:
-
Coisas como
-
myVar=42 -
IFS= read a -
date -
cd /some/directory -
ls -laR dir1 dir2 -
cat foo* > /tmp/allfoo -
ls -laR dir{1,2} -
find . -type f -name "foo*" -print > /tmp/output 2> /dev/null -
> newfile -
[ -f catfood ] -
exit
são todos considerados "comandos simples".
-
- Coisas como
simple_command1 | simple_command2 | simple_command3
x=1 | od -ab ou ls -laR | z=0 são sintaticamente válidas.
pipeline1 && pipeline2 || pipeline3são chamados de “listas” por bash e “listas AND-OR” por POSIX. Mais uma vez, um “pipeline” individual ou até mesmo um “comando simples” individual é considerado uma “lista AND-OR”, mesmo que não contenha um AND ou um OR.
AND-OR list1 & AND-OR list2 ; AND-OR list3a nomenclatura começa a ficar um pouco inconsistente. Bash chama essas “listas” também; POSIX os chama de "listas", "listas compostas" e (raramente) "termos". Mais uma vez, um indivíduo "AND-OR list", "pipeline" ou até mesmo um "comando simples" individual é considerado uma "lista", mesmo que não contenha
& ou ; . (compound_list)e
{ compound_list;} e os comandos de controle de fluxo
( for , if - then - else , while , etc.) são chamados de “comandos compostos”.
Nos exemplos acima, provavelmente faz mais sentido
interpretar A , B e C como pipelines.
Lembre-se, um “pipeline” pode ser um “comando simples” individual;
não precisa conter um pipe.