>& n
é a sintaxe da shell para duplicar diretamente um descritor de arquivo . O descritor de arquivo 2 é stderr; é assim que funciona. Você pode duplicar outros descritores de arquivos, não apenas stderr. Você não pode usar o modo append aqui porque a duplicação de um descritor de arquivo nunca trunca (mesmo que o stderr seja um arquivo) e >&
é um token, é por isso que você não pode colocar um espaço dentro dele, mas >& 2
funciona.
>> name
é uma sintaxe permitida diferente, em que name
é um nome de arquivo (e o token é >>
). Neste caso, você está usando o nome do arquivo /dev/stderr
, que por manipulação específica do SO (no Linux, é um link simbólico para /proc/self/fd/2
) também significa erro padrão. Anexar e truncar o modo ambos acabam fazendo a mesma coisa quando o stderr é um terminal porque não pode ser truncado. Se o erro padrão for um arquivo, o será truncado:
anthony@Zia:~$ bash -c 'echo hi >/dev/stderr; echo bye >/dev/stderr' 2>/tmp/foo
anthony@Zia:~$ cat /tmp/foo
bye
Se você estiver vendo um erro com /dev/stderr
sobre ssh, é possível que o administrador do servidor tenha aplicado alguma medida de segurança para impedir que o symlink funcione. (Por exemplo, você não pode acessar /proc
ou /dev
). Embora eu espere causar qualquer tipo de quebra estranha, usar a sintaxe do descritor de arquivo duplicado é uma abordagem perfeitamente razoável (e provavelmente um pouco mais eficiente). Pessoalmente eu prefiro isso.