À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/nullou 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 >¶ apontar stderr para stdout:
out=$(app 2>&1)
Outro exemplo comum é um pager, ou greputilitá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>&1ou 1>&2está 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>&1significa "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>&1para >&fooou&>foo
2>&1 | program para |& program
app 1>/dev/null 2>&1significaria que 2> & 1 apontariam para o arquivo para o qual 1 já estava redirecionando. Presumo que eu poderia fazer tão facilmenteapp > /dev/null &>?