O que 2>&1 significa?

Inscreva-se em nossa Newsletter!

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:

image 341

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 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 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

Gostou do artigo?

Facebook
LinkedIn
Pinterest
WhatsApp
Picture of Amanda Braga

Amanda Braga