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

11

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

echo "error" >&2

Às vezes /dev/stderré usado:

echo "error" > /dev/stderr 

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

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

Está usando /dev/stderre &2equivalente?

Algum desses prefere o outro?

Martin Vegter
fonte
3
echo "error" >2cria um arquivo com nome 2e conteúdo error.
Cyrus
Relacionados: unix.stackexchange.com/q/36403/38906
cuonglm
Vejo minha edição reintroduzida & 2 em vez de 2. Sua pergunta é realmente sobre o uso de >2, ou >&2?
Jeff Schaller

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ê deseja escrever código não portátil, esses dispositivos especiais são um bom ponto de partida.

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

Leitura adicional:

Thomas Dickey
fonte
Também há o caso em que alguém quer fazer, por exemplo. isso 2> bla.logfuncionaria contanto que você canalizasse 2e não codificasse /dev/stderr. Basicamente 2, não precisa ser a stderrsaída.
Larkey
6

No bash e em outros shells, a maneira de redirecionar algo para o erro padrão é usar >&2. O Bash é aberto /dev/stderrcomo o descritor de arquivo 2 . Os descritores de arquivo são referenciados por &Nonde Nestá o número do descritor. Então, echo error >&2imprimirá errorpara erro padrão, para /dev/stderr.

Também será aberto /dev/stdoutcomo descritor de arquivo 1. Isso significa que você pode fazer echo output >&1. No entanto, como tudo é impresso na saída padrão de qualquer maneira, por padrão, é o mesmo que echo outputele próprio.

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

terdon
fonte
3

Você está certo, >&2é mais direto e perfeitamente "idiomático". Eles devem ser equivalentes, portanto não há nenhuma razão específica para usar >/dev/stderr. Exceto que, se alguém lendo não sabe o que esses fazem, um deles provavelmente é mais fácil de descobrir do que o outro :-). Mas, em geral, eu 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 artificial; / dev / stdout é muito mais útil. (Descobri recentemente que o mysql_safescript do wrapper não gravará 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).

sourcejedi
fonte