Es mucho más fácil visualizar las cosas si piensas en lo que realmente está sucediendo con los "redireccionamientos" y las "canalizaciones". Los redireccionamientos y las canalizaciones en bash hacen una cosa: modificar dónde apuntan los descriptores de archivo de proceso 0, 1 y 2 (ver / proc / [pid] / fd / *).
Cuando una tubería o "|" El operador está presente en la línea de comando, lo primero que sucede es que bash crea un fifo y señala el FD 1 del comando del lado izquierdo a este fifo, y apunta el FD 0 del comando del lado derecho al mismo fifo.
A continuación, los operadores de redireccionamiento para cada lado se evalúan de izquierda a derecha , y la configuración actual se utiliza cada vez que se produce la duplicación del descriptor. Esto es importante porque, dado que la tubería se configuró primero, el FD1 (lado izquierdo) y el FD0 (lado derecho) ya han cambiado de lo que podrían haber sido normalmente, y cualquier duplicación de estos reflejará ese hecho.
Por lo tanto, cuando escribe algo como lo siguiente:
command 2>&1 >/dev/null | grep 'something'
Esto es lo que sucede, en orden:
- se crea una tubería (fifo). El "comando FD1" apunta a esta tubería. "grep FD0" también apunta a esta tubería
- "comando FD2" apunta a donde "comando FD1" apunta actualmente (la tubería)
- "comando FD1" apunta a / dev / null
Entonces, todos los resultados que el "comando" escribe en su FD 2 (stderr) se dirigen a la tubería y son leídos por "grep" en el otro lado. Todos los resultados que el "comando" escribe en su FD 1 (stdout) llegan a / dev / null.
Si, en cambio, ejecuta lo siguiente:
command >/dev/null 2>&1 | grep 'something'
Esto es lo que pasa:
- se crea una tubería y se le apunta "comando FD 1" y "grep FD 0"
- "comando FD 1" apunta a / dev / null
- "comando FD 2" apunta a dónde apunta FD 1 actualmente (/ dev / null)
Entonces, todos los stdout y stderr del "comando" van a / dev / null. Nada va a la tubería y, por lo tanto, "grep" se cerrará sin mostrar nada en la pantalla.
También tenga en cuenta que las redirecciones (descriptores de archivo) pueden ser de solo lectura (<), de solo escritura (>) o de lectura-escritura (<>).
Una nota final. Si un programa escribe algo en FD1 o FD2, depende completamente del programador. La buena práctica de programación dicta que los mensajes de error deben ir a FD 2 y la salida normal a FD 1, pero a menudo encontrará una programación descuidada que mezcla los dos o ignora la convención.