Às vezes, você quer redirecionar stdout e stderr para o mesmo local. É quando >&
é usado - ele aponta um descritor de arquivo para outro.
Por exemplo, se você quiser gravar stdout e stderr no mesmo arquivo (seja /dev/null
ou output.txt
), você pode redirecioná-los separadamente, com
app 1>/dev/null 2>/dev/null
ou você pode redirecionar um descritor de arquivo para o arquivo e o outro descritor de arquivo para o primeiro:
app 1>/dev/null 2>&1
app 2>/dev/null 1>&2
No primeiro exemplo, 2>&1
aponta o descritor de arquivo # 2 para onde # 1 já está apontando. O segundo exemplo é o mesmo, apenas começando com stderr.
Como outro exemplo, há casos em que stdout (descritor de arquivo # 1) já está apontando para o local desejado, mas você não pode se referir a ele pelo nome (pode estar associado a um pipe, um soquete ou outro). Isso geralmente acontece ao usar a expansão de processo (os operadores ' '
ou $( )
), que normalmente só captura stdout, mas você pode incluir stderr nele. Nesse caso, você também usaria >&
para apontar stderr para stdout:
out=$(app 2>&1)
Outro exemplo comum é um pager, ou grep
, ou utilitário similar, já que o pipe |
normalmente só funciona no stdout, você redirecionaria o stderr para stdout antes de usar o pipe:
app 2>&1 | grep hello
Como saber qual de 2>&1
ou 1>&2
está correto? O descritor de arquivo já configurado vai para a direita de >&
, e o descritor de arquivo que você deseja redirecionar vai para a esquerda. ( 2>&1
significa "descritor de arquivo de ponto # 2 para o descritor de arquivo # 1".)
Algumas shells têm atalhos para redirecionamentos comuns; Aqui estão alguns exemplos do Bash:
-
1>
pode ser reduzido para apenas>
-
1>foo 2>&1
a>&foo
ou&>foo
-
2>&1 | program
a|& program