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
2STDERR 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/resultsy 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/resultsanular 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>&1operador logra esto
grep "brown" poem.txt NOT_A_FILE > /tmp/results 2>&1
El &permite fiesta de distinguir de un archivo con el nombre 1y el 1descriptor de archivo.
Para mí, la declaración en 2>&1sí misma explica exactamente lo que está sucediendo: STDERR se está redirigiendo a STDOUT en sí mismo, y solo termina /tmp/resultsporque allí es donde apunta STDOUT (casi como un efecto secundario).
A diferencia de lo que afirman muchas guías, que 2>&1enví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 mezclarstdoutystderrjuntos 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