La respuesta corta es que <, >y sus variantes tienen la mayor precedencia de enlace (enlace más ajustado), seguidas de |, seguidas de &&y ||, seguidas de ;y &. Por lo tanto, solo echo "Thumbnail creation failed"se canaliza al tee.
Una respuesta un poco más larga indicaría que la prioridad más alta es en realidad la agrupación, que se puede indicar con paréntesis o llaves. Por ejemplo,
A && (B; C)
y
A && { B; C;}
son aproximadamente equivalentes a
if A
then
B
C
fi
Notas:
- Los paréntesis te dan una subshell; es decir, manda
By Cejecuta en un proceso hijo. Por lo tanto, los comandos como asignaciones variables o cd
no tendrán efecto en el shell principal. Los comandos entre llaves se ejecutan en el mismo proceso que el Acomando. Por lo tanto, el constructo de abrazadera A && { B; C;}está más cerca del if- then- elseconstructo.
- En la sintaxis de llaves, debe haber un espacio después de
{y a ;(o a &, o nueva línea) antes de }.
Para leer más, vea ¿Cuáles son los operadores de control y redireccionamiento del shell?y ¿ Cuándo es 'si' no es necesario? (particularmente mis respuestas).
Para obtener más información, consulte la página de manual bash (1) y
la especificación / definición POSIX del lenguaje de comandos de Shell , específicamente la Sección 2.9, Comandos de Shell
y la Sección 2.10.2, Reglas de gramática de Shell . Este es un intento de proporcionar algo de contexto para lo anterior:
son "tuberías". La gramática establece bloques de construcción y se basa en ellos, como es típico para gramáticas formales como esta (y para lenguajes de programación como C), por lo que un "comando simple" individual se considera una "tubería", a pesar de que no contiene un tubo. No tiene sentido (semántico) que una asignación variable sea un componente de una tubería, pero cosas como
x=1 | od -abo
ls -laR | z=0 son sintácticamente válidas.
Cosas comotubería 1 && tubería 2 || tubería 3
son llamados "listas" por bash y "listas AND-OR" por POSIX. Una vez más, una "tubería" individual o incluso un "comando simple" individual se considera una "lista AND-OR", aunque no contenga un AND o un OR.
Cuando llegas a cosas comoY-O lista 1 & AND-OR lista 2 ; Y-O lista 3
La nomenclatura comienza a ser un poco inconsistente. Bash llama a estas "listas" también; POSIX los llama "listas", "listas compuestas" y (raramente) "términos". Una vez más, una "lista AND-OR" individual, una "tubería" o incluso un "comando simple" individual se considera una "lista", aunque no contenga a &o a ;.
Cosas como( lista_compuesta )
y
{ lista_compuesta ;}y los comandos de control de flujo ( for, if-then - else, while, etc.) se denominan “comandos compuestos”.
En los ejemplos anteriores, es probable que tenga más sentido para interpretar A, By Cque sea tuberías. Recuerde, una "tubería" puede ser un "comando simple" individual; No necesita contener una tubería.
{...}debería funcionar. Podría haberlo intentado de forma no sistemática y no haber obtenido los resultados esperados.