enviando saída para / dev / stderr vs. & 2

11

Nos scripts, os erros geralmente são enviados para o descritor de arquivos 2 com &2 , ou seja:

echo "error" >&2

Às vezes, /dev/stderr é usado:

echo "error" > /dev/stderr 

Olhando para /dev/stderr , vejo que é apenas um link simbólico para /proc/self/fd/2 , que por sua vez é um symlink para /dev/pts/5 (no meu terminal atual).

Parece pouco complicado. Existe alguma lógica por trás disso?

Está usando /dev/stderr e &2 equivalente?

Alguma dessas preferidas é a outra?

    
por Martin Vegter 03.04.2016 / 18:35

3 respostas

13

O dispositivo especial /dev/stderr é específico do sistema, enquanto o descritor de arquivo 2 (não o dispositivo especial /proc/self/fd/2 ) é portátil. Se você quiser escrever código não portátil, esses dispositivos especiais são um bom lugar para começar.

Existem alguns sistemas com /dev/stderr : Linux, é claro, e OSX . Mas o OSX não tem /proc filesystem e seu /dev/stderr é um link para /dev/fd/2 .

Leitura adicional:

por 03.04.2016 / 18:45
6

No bash e em outros shells, a maneira de redirecionar um erro padrão para é usar >&2 . Bash abre /dev/stderr como o descritor de arquivos 2 . Os descritores de arquivo são referenciados por &N , em que N é o número do descritor. Portanto, echo error >&2 imprimirá error para o erro padrão, para /dev/stderr .

Ele também abrirá /dev/stdout como descritor de arquivo 1 . Isso significa que você pode fazer echo output >&1 . No entanto, como tudo é impresso na saída padrão, por padrão, é o mesmo que echo output por si mesmo.

Agora, 2> é diferente. Aqui, você está redirecionando a saída de erro de um comando para outro lugar. Portanto, 2>file significa "redirecionar qualquer coisa impressa para o descritor de arquivo 2 (erro padrão) para file ".

    
por 03.04.2016 / 18:51
4

Você está certo, >&2 é mais direto e perfeitamente "idiomático". Eles devem ser equivalentes, portanto, não há motivo específico para usar >/dev/stderr . Só que, se alguém ler não sabe o que isso faz, um deles é provavelmente mais fácil de descobrir do que o outro :-). Mas, em geral, sugiro que você use >&2 .

/ dev / stderr pode ser útil quando os programas gravam erros em um nome de arquivo especificado, mas não suportam stderr. Claramente isso é um pouco inventado; / dev / stdout é muito mais útil. (Recentemente, descobri que o script mysql_safe wrapper não grava erros no console; infelizmente, ele também deseja alterar as permissões no arquivo de log de erros, portanto, usar / dev / stderr causa alguns avisos supérfluos).

    
por 03.04.2016 / 18:45