A veces desea redirigir tanto stdout como stderr a la misma ubicación. Esto es cuando >&se usa: señala un descriptor de archivo a otro.
Por ejemplo, si desea escribir stdout y stderr en el mismo archivo (ya sea /dev/nullo output.txt), puede redirigirlos por separado, con
app 1>/dev/null 2>/dev/null
o puede redirigir un descriptor de archivo al archivo y el otro descriptor de archivo al primero:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
En el primer ejemplo, 2>&1señala el descriptor de archivo # 2 a donde # 1 ya está apuntando. El segundo ejemplo logra lo mismo, solo comienza con stderr.
Como otro ejemplo, hay casos en que stdout (descriptor de archivo # 1) ya está apuntando a la ubicación deseada, pero no puede referirse a él por su nombre (puede estar asociado con una tubería, un zócalo o tal). Esto sucede a menudo cuando se utiliza la expansión del proceso (los operadores ` `o $( )), que normalmente solo captura stdout, pero es posible que desee incluir stderr en él. En este caso, también >&usarías para señalar stderr a stdout:
out=$(app 2>&1)
Otro ejemplo común es un buscapersonas, o grepuna utilidad similar, ya que la tubería |normalmente solo funciona en stdout, redirigiría stderr a stdout antes de usar la tubería:
app 2>&1 | grep hello
¿Cómo saber cuál de 2>&1o 1>&2es correcta? El descriptor de archivo ya configurado va a la derecha de >&, y el descriptor de archivo que desea redirigir va a la izquierda. ( 2>&1significa "señalar el descriptor de archivo # 2 al descriptor de archivo # 1")
Algunos proyectiles tienen accesos directos para redireccionamientos comunes; Aquí hay ejemplos de Bash:
app 1>/dev/null 2>&1significaría que 2> & 1 apuntaría al archivo al que 1 ya estaba redirigiendo. ¿Supongo que podría hacerlo con la misma facilidadapp > /dev/null &>?the already set up fd goes to the right of >&, and the fd you want to redirect goes to the left. ¿Qué quiere decir con el descriptor de archivo ya configurado? ¿Qué significa el derecho de?Una situación cuando la necesita es cuando desea mostrar la
stracesalida en un buscapersonas.straceimprime su salida a error estándar y las tuberías generalmente conectan la salida estándar a la entrada estándar, por lo que debe usar la redirecciónfuente
pipes generally connect standard output to standard input?|) toma la salida estándar del primer comando y la conecta a la entrada estándar del segundo comando.A veces desea redirigir ambos
stdout(1) ystderr(2) a la misma ubicación (/dev/nullpor ejemplo). Una forma de lograr esto sería:Pero la mayoría de la gente se acortan esta redirigiendo
stderrastdoutcon2>&1:Una versión aún más corta es:
fuente
2: es para cuando tendrá salida proveniente tanto de error estándar como de salida estándar, y desea que se compongan en una sola cadena.
1: Cuando desea manipular la salida de error estándar y salida estándar.
fuente
>2se envía a / dev / null. ¿O me he equivocado completamente?Lo uso para comenzar un trabajo separado:
entonces puedo cerrar sesión y someProgram todavía se estará ejecutando. La funcionalidad es proporcionada por GNU Screen, tmux y algunos otros programas, pero aquí se logra sin ninguna dependencia externa.
fuente
nohupodisownen tales casos.Imagine que hay un directorio llamado
tryque tiene estos tres archivos:file file1 and file2.Ahora ejecuta este comando:
Los primeros tres archivos se abren pero
catarrojan un error al abrir el cuarto, ya que no existe.Ahora ejecuta:
No verá ninguna salida en la pantalla: En primer lugar
1>outfilese redirigir la salida de la orden paraoutfiley luego volverá a dirigir (2>&1) lanza el error al intentar abrirfile3aoutfile.1>&2funciona de manera similar y redirige el flujo de error a la salida estándar.¡Espero que esto ayude!
fuente
Use el
ttycomando en cada terminal para identificarlos:Suponiendo estos TTY, para redirigir el stdout del primero al segundo, ejecute esto en el primer terminal:
Para restaurar el comportamiento predeterminado stdout de pts / 0:
Vea este video para una demostración.
fuente
El caso al redirigir stderr a stdout ya se ha cubierto aquí (por ejemplo, úselo para filtrar mensajes de error (grep)).
El otro caso es redirigir stdout a stderr. Un caso de uso común (al menos para mí) es enviar advertencias / mensajes de error impresos con "echo" (en mis shellscripts) al stderr (para que puedan llamar la atención del usuario más fácilmente).
Por ejemplo,
fuente