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 &>
?