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>&1
Este 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"
hello
Estes 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 stdout
Nã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 redirection
Você 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 directory
Vamos 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_exist
Embora 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.txt
Você vê um erro exibido no seu console e está vazio. Nosso redirecionamento não redireciona nada.
cat: filedoesntexist: No such file or directory
result.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 directory
Isso 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.txt
Vejamos 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.txt
Isso 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>&1
Ei, 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>&2
Você 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>&1
A 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!
Recursos
- Descritor de arquivo (Definições)
- Descritor de Arquivo – Unix Geral e C Avançado
- O que “2>&1” faz na linha de comando?
- Entendendo o idiomário do Shell Script: 2>&1
- O que ‘>/dev/null 2>&1’ significa neste artigo sobre os fundamentos do crontab?
- O que “/dev/null” significa no final de comandos de shell?