yo se que
program > /dev/null 2>&1
hace. Redirige la salida hacia /dev/null
y 2>&1
significa redirigir la salida de error en el mismo lugar donde se envía la salida.
Mi problema es que siempre tengo que buscarlo en Google porque nunca lo recuerdo.
Por lo tanto, trato &2>1
, 1>2&
, 1>&2
... Trato todas las combinaciones hasta que Google él ...
¿Cuál es el truco para recordarlo fácilmente?
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, terminoRespuestas:
La salida es mejor que el error, por lo que viene primero (1 vs 2).
>
es la abreviatura de 'va a'. A la izquierda es lo que quiero enviar y a la derecha es donde quiero enviarlo. Dado que 'donde' es (casi) siempre un archivo, algo así comoredirigiría a un archivo llamado 1. Por lo tanto, el ampersand
(&)
modifica el archivo al descriptor de archivo.Desafortunadamente, no he encontrado ni desarrollado mi propia mnemónica, pero cuando aprendí * nix, encontré esta forma lógica de trabajar bien. Después de algunos recorridos, se convierte en una segunda naturaleza.
fuente
stdout
es el descriptor de archivo 1,stderr
es 2. Entonces, "error" viene antes de "salida".stdout
ystderr
referir.Un truco es recordar que 1 = salida estándar, 2 = error estándar. Asi que:
2>&1
= la secuencia de error estándar entra en la secuencia de salida estándar.1>&2
= viceversa.Si alguna vez ha programado en un lenguaje similar a C, es fácil recordar el signo y (
&
). Elijo pensar que se refiere a la "dirección del" descriptor de archivo existente, para que no cambie el archivo en sí mismo ni cree uno nuevo.fuente
Verlo
&
como un nudo podría ayudar: piense en lo que quiere hacer tomando la salida de 2, entonces2>
, y vinculándola con 1, entonces2>&1
fuente
En realidad, depende de qué shell estés usando. Bash suele ser muy indulgente y puedes hacer lo siguiente:
fuente
Consideremos estas tres opciones:
El primero envía stderr a los nombres de archivo "1": después de todo, bash espera redirigir a un archivo.
El segundo también redirige al mismo archivo pero se ejecuta
program
en segundo plano: eso es lo que&
se supone que significa un final .Eso deja la tercera posibilidad como la única que tiene sentido en el universo bash para redirigir a un identificador de archivo.
¿Cómo recordar cuál es cuál entre 0, 1, 2? Piense en ejecutar una computadora desde la consola. Primero, debe escribir algo (0 = stdin). Entonces, ves salida (1 = stdout). Por último y solo si algo sale mal, verá stderr (2).
fuente
Dibújala en tu fondo de pantalla.
Ahora, en serio, esta y otras cosas básicas que olvidé, así que agregué un menú de consejos rápidos a una aplicación que desarrollé y que uso a diario. Es posible que desee probarlo o usar algo como gnote para mantener una nota.
fuente
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
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
y el ejecutar el comando
luego
¿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>>
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 estoEl
&
permite fiesta de distinguir de un archivo con el nombre1
y el1
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
fuente