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
B
eC
são executados em um processo filho. Assim sendo, comandos como atribuições de variáveis oucd
nã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.