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

27

Isso não faz sentido para mim.

wibble > /dev/null 2>&1

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 do comando xxx > /dev/null 2>1 ?

    
por whoami 04.11.2011 / 16:19

1 resposta

39

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

2>&1 1> /dev/null

O primeiro redirecionamento faz com que stderr aponte para o fluxo que stdout aponta para esse momento (que é seu tty essencialmente). Isso não torna stderr um alias de stdout .

Em seguida, stdout é redirecionado para o depósito de bits. O redirecionamento stdout não afeta o redirecionamento stderr anterior. stderr ainda se refere ao seu tty.

Então:

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

imprimirá apenas a mensagem de erro no seu terminal.

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

Note that the order of redirections is significant. For example, the command

          ls > dirlist 2>&1

directs both standard output and standard error to the file dirlist, while the command

          ls 2>&1 > dirlist

directs only the standard output to file dirlist, because the standard error was duplicated from the standard output before the standard output was redirected to dirlist.

    
por 04.11.2011 / 17:08