Por que o redirecionamento STDERR para / dev / null é feito dessa maneira?

29

Isto não faz sentido para mim.

wibble > /dev/null 2>&1

Eu acho que faria mais sentido se fosse algo assim:

wibble 2>&1 > /dev/null

Em outras palavras

Commands Output Sendall STDERRORS to STDOUT then SEND it all to /dev/null

Qual é o pensamento por trás da ordem do redirecionamento de comando xxx > /dev/null 2>1?

Quem sou eu
fonte
6
Você também pode achar útil essa explicação .
rozcietrzewiacz
Graças @rozcietzewiacz que realmente explica a minha pergunta exatamente
whoami
1
Há uma excelente passagem no meio dessa página no Wiki de Greg: “Se você ainda está confuso neste momento, provavelmente é porque começou com um equívoco sobre como os FDs funcionam e você não conseguiu descartar esse equívoco. ainda. Não se preocupe - é um equívoco extremamente comum e você não está sozinho. ... Muitas pessoas pensam que, de 2>&1alguma forma, "une" ou "une" ou "casa" os dois DFs, de modo que qualquer mudança [subsequente] em um deles se torne uma mudança no outro. Este não é o caso. ”
G-Man diz 'Reinstate Monica'

Respostas:

41

Os redirecionamentos são processados ​​da esquerda para a direita. Se você fizer

2>&1 1> /dev/null

O primeiro redirecionamento stderraponta para o fluxo que stdoutaponta para o momento (que é o seu tty essencialmente). Não stderrcria um pseudônimo de stdout.

Em seguida, stdouté redirecionado para o bloco de bits. O stdoutredirecionamento não afeta o stderrredirecionamento anterior . stderrainda se refere ao seu tty.

Tão:

ls file_that_doesnt_exist 2>&1 1> /dev/null

imprimirá apenas a mensagem de erro no seu terminal.

A bashpágina de documentação de redirecionamento menciona isso explicitamente:

Observe que a ordem dos redirecionamentos é significativa. Por exemplo, o comando

          ls > dirlist 2>&1

direciona a saída padrão e o erro padrão para a lista de diretórios do arquivo, enquanto o comando

          ls 2>&1 > dirlist

direciona apenas a saída padrão para o arquivo dirlist, porque o erro padrão foi duplicado da saída padrão antes que a saída padrão fosse redirecionada para dirlist .

Esteira
fonte
3
Yay resolve meu enigma. Eu ainda acho logicamente confuso. mas eu achei uma outra parte na mesma página que é interessante &>/dev/nullé semanticamente equivalente a/dev/null 2>&1
whoami
1
Deve-se enfatizar que a página da qual você está falando faz parte do Manual de Referência do Bash . Obviamente, descreve o bash . Existem outras conchas no mundo, diferentes da bash, e &>e >&(quando não usadas no contexto 2>&1ou >&2etc.) são bash-ismos e não são padrão . Eles não devem ser usados ​​em scripts de shell que você deseja que sejam portáteis.
G-Man diz 'Reinstate Monica'