Una tubería es una | lista de -delimited comandos. Las redirecciones que especifique se aplican a los comandos constituyentes (simples o compuestos), pero no a la interconexión como un todo. Cada tubería encadena la salida estándar de un comando al estándar de la siguiente aplicando implícitamente un redireccionamiento a cada subcadena antes de se evalúan las redirecciones asociadas con un comando.
cmd 2>&1 | less
Primera salida estándar de la primera subcapa se redirige a la tubería de la que es la lectura less
. A continuación, se aplica el redireccionamiento 2>&1
al primer comando. Redirigir stderr a stdout funciona porque stdout ya está apuntando a la tubería.
cmd | less 2>&1
Aquí, la redirección se aplica a less
. El std y el stderr de Less comenzaron presumiblemente hacia la terminal, por lo que 2>&1
en este caso no tiene ningún efecto.
Si desea una redirección a aplicar a una tubería entera, para agrupar varios comandos como parte de una tubería, o para tuberías nido, a continuación, utilizar un grupo de comandos (o cualquier otra comando compuesto):
{ { cmd1 >&3; cmd2; } 2>&1 | cmd3; } 3>&2
Puede ser un ejemplo típico. El resultado final es: cmd1
y cmd2
's stderr ->cmd3
; cmd2
's stdout ->cmd3
; y cmd1
y cmd3
's stderr, y cmd3
's stdout -> el terminal.
Si usa el tubo Bash-specific |&
, las cosas se vuelven extrañas, porque cada una de las redirecciones estándar de la tubería todavía se produce primero, pero la redirección de stderr es la última. Por ejemplo:
f() { echo out; echo err >&2; }; f >/dev/null |& cat
Ahora, en contra de la intuición, todos los resultados están ocultos. La primera extensión de f
va a la tubería, la siguiente extensión de f
se redirige a /dev/null
, y finalmente, stderr se redirige a stdout (/dev/null
todavía).
Recomiendo nunca usar |&
en Bash - se usa aquí para la demostración.
+1 bien explicado – jordanm
+1. Lo único que agregaría es que una tubería es un separador de comandos, como punto y coma. –
+1 ¡Guau, excelente respuesta @ormaaj! Exactamente lo que estaba buscando, ¡gracias! –