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/null
o 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>&1
señ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 grep
una 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>&1
o 1>&2
es 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>&1
significa "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>&1
significarí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
strace
salida en un buscapersonas.strace
imprime 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/null
por ejemplo). Una forma de lograr esto sería:Pero la mayoría de la gente se acortan esta redirigiendo
stderr
astdout
con2>&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
>2
se 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
nohup
odisown
en tales casos.Imagine que hay un directorio llamado
try
que tiene estos tres archivos:file file1 and file2.
Ahora ejecuta este comando:
Los primeros tres archivos se abren pero
cat
arrojan un error al abrir el cuarto, ya que no existe.Ahora ejecuta:
No verá ninguna salida en la pantalla: En primer lugar
1>outfile
se redirigir la salida de la orden paraoutfile
y luego volverá a dirigir (2>&1
) lanza el error al intentar abrirfile3
aoutfile
.1>&2
funciona de manera similar y redirige el flujo de error a la salida estándar.¡Espero que esto ayude!
fuente
Use el
tty
comando 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