Se você tem escrito scripts de shell por um tempo, você pode ter visto alguns idiomas. Ex: 1>&22>&1
SOME_COMMAND > /dev/null 2>&1Este artigo irá explicar o que aquela aparência estranha significa. 2>&1
TL;DR:
2>&1 significa redirecionar o stderr (>2) para onde o stdout está sendo redirecionado (&1).
Antes de começarmos, quero rever um conceito básico de descritores de arquivo. Existem 3 descritores de arquivo no UNIX e cada um está associado a um número:

Não vamos cobrir isso neste artigo, mas vamos falar sobre stdin, stdout e stderr. Vamos lá!
stdout
Quando você executa um comando, por exemplo: . Você verá o resultado do seu comando exibido na tela. Neste caso, eu vejo: ls
> ls
README.md components src Vamos fazer mais um.
> echo "hello"
helloEstes são exemplos de: stdout, stderr. Todos eles têm um valor de descritor de arquivo de 1. Se você quiser saber mais sobre descritores de arquivo, confira os recursos no final desta postagem. stdout
Redirecionamento do stdout
Você pode redirecionar o seu com isso. stdout>
> echo "Hello stdout" > result.txt
> cat result.txt
Hello stdoutNão vemos mais “Hello stdout” depois de executar. Isso acontece porque, em vez de ser exibido no console, ele é redirecionado para. O arquivo contém a nossa saída:
echo"Hello stdout"result.txtresult.txtecho"Hello stdout"
Vamos tentar mais um!
> ls > result.txt
> cat result.txt
README.md
component
src Desta vez você vê o conteúdo de dentro
lsresult.txt
Meu ponto é, tudo o que você vê na tela (que não seja um erro) – tudo – pode ser redirecionado com stdout>
Por falar nisso, “de qualquer forma” é uma abreviação para “de qualquer maneira”. Se você fizer isso: >1>
> echo "Hello redirection" 1> result.txt
> cat result.txt
Hello redirectionVocê obtém a mesma funcionalidade usando como com. Tenha isso em mente.
stderr
Às vezes podemos encontrar erros ao executar um comando.
> cat filedoesntexist.txt
cat: filedoesntexist.txt: No such file or directory
> ls idontexist
ls: idontexist: No such file or directoryVamos comparar a execução de dois comandos diferentes. Substitua abaixo por um arquivo real no seu diretório atual.
> cat something_that_exists
> cat something_that_doesnt_existEmbora cada um retorne algum tipo de saída, o seu computador não interpreta essas duas saídas da mesma forma. tem descritor de arquivo de 1 e tem descritor de arquivo de 2.
cat something_that_existscat something_that_doesnt_exist
Redirecionamento de stderr
Deixe-me mostrar como eles são diferentes. Se tentarmos redirecionar um mau ( 😺 piada não intencional):
> cat filedoesntexist > result.txt
cat: filedoesntexist: No such file or directory
> cat result.txtVocê vê um erro exibido no seu console e está vazio. Nosso redirecionamento não redireciona nada.
cat: filedoesntexist: No such file or directoryresult.txt
Isso é porque quando executamos, obtemos um e não . Quando tentamos redirecionar para result.txt com , não há para ser redirecionado. Para redirecionar, precisamos usar redirecionar, não redirecionar. Para redirecionar, usamos:
cat filedoesntexiststderrstdoutstdout> result.txtstdoutstderrstderrstdoutstderr2>
> cat filedoesntexist 2> result.txt
> cat result.txt
cat: filedoesntexist: No such file or directoryIsso parece melhor. Não vemos mais a saída de erro ao executar e nossa string de erro contém. Nós redirecionamos com sucesso nosso 😸 ruim.
cat filedoesntexistresult.txtcat: filedoesntexist: No such file or directorycat
Então aprendemos que existem pelo menos 2 redirecionamentos: e . O primeiro redireciona saídas normais, o segundo redireciona saídas de erro. >2>
Para reforçar nosso conhecimento, o que você acha que acontecerá se usarmos redirecionamento? Não leia mais. Pense um pouco sobre isso. Quando estiver pronto, leia adiante. echo2>
.
.
.
.
.
> echo "Hello Cat" 2> result.txt
Hello Cat
> cat result.txtVejamos sendo ecoado para o nosso console e está em branco, porque estamos redirecionando a partir do nosso . Como o nosso não retorna nenhum erro, nada é redirecionado para o console.
Hello Catresult.txtstderrechoechoresult.txt
Stdout, Stderr2>&1
Vamos fazer um último exemplo.
> ls myDir > result.txt 2> result.txtIsso redirecionará a saída de execução para. Dessa forma, se existir, ele redirecionará a saída para e se não existir, redirecionará a mensagem de erro para. O usuário não verá nenhuma saída, seja que o comando funcione ou não. É uma situação ganha-ganha.
stdoutstderrls myDirresult.txtmyDirresult.txtmyDirresult.txt
Isso parece um pouco longo, não é? Felizmente podemos encurtá-lo.
> ls myDir > result.txt 2>&1Ei, olha isso! Nosso ditado. Significa redirecionar qualquer stderr (2>) para o mesmo lugar que estamos redirecionando o stdout &1).2>&1
Isso mesmo! Pense nisso. Internalize-o.
ls meuDir > resultado.txt 2>&1
Você pode misturar descritores de arquivos, por exemplo, o que você acha que isso faz?
> ls myDir 2> result.txt 1>&2Você deve ter adivinhado agora: significa “redirecionar para onde está sendo redirecionado”.
1>&2stdoutstderr
Então, para que as pessoas usam isso? Eu já vi pessoas executando o comando que vemos acima (ex: Referência rápida do Crontab (desabilitar email)): 2>&1
> CMD > /dev/null 2>&1A linha de código acima redireciona as mensagens de saída e erro de qualquer coisa que você esteja executando para (se você estiver se perguntando o que é /dev/null, é um arquivo especial que descarta tudo o que é escrito nele. Eu penso nisso como um buraco negro/destruidor de papel). CMD/dev/null
Esse é um bom lugar para parar.
Espero que isso faça sentido até agora. Se não, sugiro que você releia ou leia alguns dos recursos abaixo. Reserve um tempo para entender isso, especialmente se for novo para você. Demorou um pouco para eu entender.
Obrigado por ler! Agradeço muito. Agora vá escrever alguns scripts legais com isso!