Eu estava recebendo todas aquelas mensagens do firefox com as quais não me importava:
Gtk-Message: Failed to load module "pk-gtk-module"
Gtk-Message: Failed to load module "canberra-gtk-module"
Então eu matei firefox
e reiniciei assim:
$ firefox 2>&1 > /dev/null &
stderr
Como em "redirecionar stdout
e canalizar ambos para o arquivo null
".
Infelizmente, essas mensagens irritantes não desapareceram. Na verdade, a janela do terminal em que iniciei a firefox
sessão na qual estou digitando essa pergunta ainda está produzindo.
Então as perguntas são:
Por que o redirecionamento acima não funcionou?
Como redirecioná-los corretamente?
Você tem que fazer isso na ordem oposta: primeiro redirecione stdout, depois redirecione stderr para stdout:
EDIT: Aqui está uma explicação.
2>&1
é uma operação de duplicação do descritor de arquivo (consulte a página de manual do bash e procure porDuplicating File Descriptors
): ele diz "duplicar descritor de arquivo 2 para fazer a mesma coisa que o descritor de arquivo 1". Depois, qualquer coisa escrita em fd 2 será enviada para onde fd 1 enviar as coisas. Então stderr (2) e stdout (1) escreverão no mesmo lugar. Mas eles são independentes, então se você alterar fd 1 depois (por exemplo, redirecionando stdout), fd 2 permanecerá: ele ainda escreverá para onde fd 1 estava escrevendo antes desse último redirecionamento.Se você redirecionar stdout primeiro e depois duplicar, ambos fd 1 e fd 2 estarão gravando no mesmo local: para onde fd 1 foi redirecionado.
Basicamente, o shell executa redirecionamentos/duplicações da esquerda para a direita, então você precisa acertar a ordem.
Observe que, como um caso especial, o bash fornece um atalho para redirecionar stdout e stderr para o mesmo local:
é equivalente a