En lo que respecta al shell bash, creo que la mejor manera de recordar es entender lo que está sucediendo.
Si todo lo que quiere hacer es recordar cómo obtener el comando correcto, puede intentar
program > /results 2> /results
Eso es agradable y obvio, y fácil de recordar. es decir
1
STDOUT va a /results
2
STDERR también va directamente a/results
El problema es que esto no funciona como cabría esperar. considera lo siguiente:
archivo: /tmp/poem.txt
the quick brown fox jumped over the lazy dog
y el ejecutar el comando
grep "brown" /tmp/poem.txt NOT_A_FILE > /tmp/results 2> /tmp/results
luego
$ cat /tmp/results
grep: NOT_A_FILE: No such file or directory
lazy dog
¿lo que pasó aquí?
Tengo entendido que bash configuró la redirección apuntando el STDERR directamente al archivo /tmp/results
y debido a la naturaleza de lo >
que hace 2 cosas
- normalmente crea un nuevo archivo; en este caso, la oportunidad ha pasado ya que bash ha superado esta rutina en el momento en que se genera la salida.
- inserte directamente en el comienzo del archivo. y no agregar como lo
>>
hace.
Entonces, en este caso, STDERR, se inserta directamente al comienzo de /tmp/results
anular la salida de STDOUT.
Nota: si solía >>
agregar, probablemente podría salirse con esta sintaxis.
Sin embargo, para solucionar el problema que necesita, no para redirigir STDERR, al archivo directamente, sino para fusionar la salida de STDERR en la secuencia STDOUT, para que no se produzca una colisión.
El uso del operador 2>&1
operador logra esto
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
El &
permite fiesta de distinguir de un archivo con el nombre 1
y el 1
descriptor de archivo.
Para mí, la declaración en 2>&1
sí misma explica exactamente lo que está sucediendo: STDERR se está redirigiendo a STDOUT en sí mismo, y solo termina /tmp/results
porque allí es donde apunta STDOUT (casi como un efecto secundario).
A diferencia de lo que afirman muchas guías, que 2>&1
envía STDERR a donde se señala STDOUT. Si eso fuera cierto, todavía tendría el problema de sobrescritura.
Para obtener más información, consulte: http://mywiki.wooledge.org/BashGuide/InputAndOutput#File_Redirection
program 1> /dev/null 2>/dev/null
. Algunas veces, sin embargo, es necesario mezclarstdout
ystderr
juntos para ver lo que realmente está sucediendo, como el resultado de un complejo proceso de compilación que se redirige a un archivo. En ese caso, termino