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
B
y C
ejecuta 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 A
comando. Por lo tanto, el constructo de abrazadera A && { B; C;}
está más cerca del if
- then
- else
constructo.
- 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 -ab
o
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
, B
y C
que 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.