Às vezes, você deseja redirecionar stdout e stderr para o mesmo local. É quando >&
é usado - aponta um descritor de arquivo para outro.
Por exemplo, se você deseja gravar stdout e stderr no mesmo arquivo (seja /dev/null
ou output.txt
), poderá 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 nº 2 para onde o nº 1 já está apontando. O segundo exemplo alcança o mesmo, apenas começando com stderr.
Como outro exemplo, há casos em que o stdout (descritor de arquivo nº 1) já está apontando para o local desejado, mas você não pode fazer referência a ele pelo nome (pode estar associado a um tubo, um soquete ou algo assim). Isso geralmente acontece quando se utiliza a expansão do processo (as ` `
ou $( )
operadores), que normalmente só captura stdout, mas você pode querer 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
utilitário similar, uma vez que o canal |
normalmente só funciona no stdout, você redirecionaria o stderr para o stdout antes de usar o canal:
app 2>&1 | grep hello
Como saber qual 2>&1
ou 1>&2
está correto? O descritor de arquivo já configurado vai para a direita >&
e o descritor de arquivo que você deseja redirecionar vai para a esquerda. ( 2>&1
significa "apontador descritor de arquivo nº 2 para descritor de arquivo nº 1".)
Alguns shells possuem atalhos para redirecionamentos comuns; Aqui estão alguns exemplos do Bash:
1>
pode ser reduzido para apenas >
1>foo 2>&1
para >&foo
ou&>foo
2>&1 | program
para |& program
app 1>/dev/null 2>&1
significaria que 2> & 1 apontariam para o arquivo para o qual 1 já estava redirecionando. Presumo que eu poderia fazer tão facilmenteapp > /dev/null &>
?