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/stderr
e &2
equivalente?
Algum desses prefere o outro?
portability
stderr
Martin Vegter
fonte
fonte
echo "error" >2
cria um arquivo com nome2
e conteúdoerror
.>2
, ou>&2
?Respostas:
O dispositivo especial
/dev/stderr
é específico do sistema, enquanto o descritor de arquivo2
(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/proc
sistema de arquivos e/dev/stderr
é um link para/dev/fd/2
.Leitura adicional:
fonte
2> bla.log
funcionaria contanto que você canalizasse2
e não codificasse/dev/stderr
. Basicamente2
, não precisa ser astderr
saída.No bash e em outros shells, a maneira de redirecionar algo para o erro padrão é usar
>&2
. O Bash é aberto/dev/stderr
como o descritor de arquivo2
. Os descritores de arquivo são referenciados por&N
ondeN
está o número do descritor. Então,echo error >&2
imprimiráerror
para erro padrão, para/dev/stderr
.Também será aberto
/dev/stdout
como descritor de arquivo1
. Isso significa que você pode fazerecho output >&1
. No entanto, como tudo é impresso na saída padrão de qualquer maneira, por padrão, é o mesmo queecho output
ele próprio.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) parafile
".fonte
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_safe
script 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).fonte