yo se que
program > /dev/null 2>&1
hace. Redirige la salida hacia /dev/nully 2>&1significa 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 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, 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
stdoutes el descriptor de archivo 1,stderres 2. Entonces, "error" viene antes de "salida".stdoutystderrreferir.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>&1fuente
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
programen 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
1STDOUT va a/results2STDERR también va directamente a/resultsEl problema es que esto no funciona como cabría esperar. considera lo siguiente:
archivo:
/tmp/poem.txty el ejecutar el comando
luego
¿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>>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 estoEl
&permite fiesta de distinguir de un archivo con el nombre1y el1descriptor 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
fuente