|

Para que serve e como usar o “2>&1” no Shell Script?

Quando trabalhamos com uma linguagem de programação ou script, frequentemente usamos certos “idiomas”, que são padrões de código amplamente aceitos para resolver problemas de maneira eficaz. No caso do Shell Script, um desses padrões comuns – mas nem sempre bem compreendidos – é o uso de 2>&1, como no exemplo:

ls foo > /dev/null 2>&1

Neste artigo, vamos explicar o que está acontecendo aqui e por que essa notação funciona dessa maneira.

Redirecionamento de entrada e saída (I/O redirection)

Redirecionamento de entrada e saída (I_O redirection)
Redirecionamento I/O direciona saídas ou entradas de comandos para arquivos, dispositivos ou outros comandos.

Em termos simples, o redirecionamento é o mecanismo que usamos para enviar a saída de um comando para outro destino. Quando executamos um comando simples, como cat para ler o conteúdo de um arquivo, por exemplo:

$ cat foo.txt
foo
bar
baz

Por padrão, o conteúdo é impresso na tela. Contudo, é possível redirecionar essa saída para outro lugar. Se redirecionarmos a saída para um arquivo chamado output.txt, por exemplo:

$ cat foo.txt > output.txt

Após este comando, ao verificar o conteúdo de output.txt, vemos:

$ cat output.txt
foo
bar
baz

Observe que o comando cat foo.txt > output.txt não exibe nada na tela. Isso ocorre porque alteramos o destino da saída padrão (stdout) do comando, que deixou de ser a tela e passou a ser o arquivo output.txt.

É importante entender que há uma outra saída chamada de erro padrão (stderr), usada por programas para enviar mensagens de erro. Por exemplo, ao tentar acessar um arquivo que não existe:

$ cat nop.txt > output.txt
cat: nop.txt: No such file or directory

Mesmo que o redirecionamento para output.txt esteja ativo, a mensagem de erro aparece na tela, pois estamos redirecionando apenas a saída padrão (stdout) e não o erro padrão (stderr).

Descritores de arquivo (File Descriptors)

Os descritores de arquivo são inteiros positivos que representam arquivos abertos no sistema. Cada vez que um arquivo é aberto, o sistema associa um descritor de arquivo a ele. Em sistemas Unix, tudo é tratado como um arquivo – o que significa que a tela, os dispositivos de entrada e saída, e até mesmo fluxos de rede possuem descritores.

Para facilitar, os sistemas Unix definem dois descritores de arquivos especiais para o Shell Script: um para a saída padrão (stdout) e outro para o erro padrão (stderr). O descritor para stdout é sempre identificado pelo número 1, enquanto o stderr é identificado pelo número 2.

Essa numeração simplifica o uso de redirecionamento no Shell Script, permitindo que direcionemos a saída e o erro para destinos específicos usando seus descritores.

Unindo as partes

Voltando ao exemplo inicial de redirecionamento do comando cat, podemos reescrevê-lo explicitamente usando o descritor 1:

$ cat foo.txt 1> output.txt

O número 1 representa o descritor de arquivo do stdout, e o operador > indica o redirecionamento. Quando omitimos o descritor 1 antes do >, como em cat foo.txt > output.txt, o Shell assume automaticamente o stdout, sendo um atalho para 1>.

Para redirecionar a saída de erro, é necessário usar o descritor 2, direcionando o stderr para um arquivo de destino específico:

$ cat nop.txt 2> error.txt

Se verificarmos o conteúdo de error.txt, veremos:

$ cat error.txt
cat: nop.txt: No such file or directory

O idioma 2>&1

Neste ponto, você já deve ter uma ideia do que 2>&1 faz, mas vamos formalizar esse entendimento.

Ao usar &1, estamos referenciando o valor atual do descritor 1, ou seja, o stdout. Assim, 2>&1 instrui o Shell a redirecionar o stderr (2) para o mesmo local que o stdout. Dessa forma, podemos redirecionar tanto stdout quanto stderr para o mesmo destino, como mostrado a seguir:

$ cat foo.txt > output.txt 2>&1

E então, ao verificar output.txt, temos:

$ cat output.txt
foo
bar
baz

Agora, se executarmos um comando que gera um erro, também será possível redirecionar o erro para o mesmo arquivo:

$ cat nop.txt > output.txt 2>&1

Neste caso, output.txt conterá:

cat: nop.txt: No such file or directory

Recapitulando

Vamos revisar os conceitos abordados para consolidar o entendimento sobre o uso de 2>&1:

  1. Existem duas saídas principais para os programas:
    • Saída padrão (stdout): para onde o programa envia sua saída principal.
    • Erro padrão (stderr): para onde o programa envia mensagens de erro.
  2. É possível redirecionar essas saídas para um destino diferente, como um arquivo ou outro comando.
  3. Descritores de arquivo identificam stdout e stderr:
    • 1 representa o stdout.
    • 2 representa o stderr.
  4. O redirecionamento de saída pode ser feito com atalhos:
    • command > arquivo é um atalho para command 1> arquivo, redirecionando apenas o stdout.
    • Para redirecionar stderr, usamos 2> arquivo.
  5. Referenciando o valor de um descritor de arquivo com &:
    • &[DESCRITOR] referencia o valor atual do descritor, permitindo redirecionamentos dinâmicos.
    • 2>&1 redireciona o stderr para onde o stdout está direcionado, permitindo que ambos sejam capturados no mesmo destino.

Exemplo prático

Imagine que você deseja executar um comando e redirecionar tanto a saída quanto o erro para um arquivo de log. Isso é especialmente útil ao executar scripts longos onde você quer revisar posteriormente qualquer erro ou saída gerada.

$ ./meu_script.sh > log.txt 2>&1

Neste exemplo, meu_script.sh é executado, e tanto as saídas normais quanto os erros são redirecionados para log.txt.

Este padrão é amplamente utilizado em scripts e pipelines de Shell, tornando o gerenciamento de saída e tratamento de erros mais eficiente.

Como usar 2>&1 na prática?

Compreender o funcionamento de 2>&1 ajuda a otimizar o uso de Shell Script e a manipular saídas de maneira controlada. Esse conhecimento é fundamental ao criar scripts mais complexos, onde precisamos lidar com a captura de erros e o redirecionamento de informações para locais específicos, seja para logs ou outros comandos.

A prática e o entendimento claro do funcionamento dos descritores de arquivo no Shell permitem o desenvolvimento de soluções robustas e eficientes, fundamentais para qualquer desenvolvedor ou administrador de sistemas que trabalha com Shell Script no dia a dia.

Perguntas frequentes sobre o Shell Script

Para que serve e como usar o _2_&1_ no Shell Script
O `2>&1` redireciona erros (stderr) para o mesmo local da saída padrão (stdout).

O Shell Script é uma ferramenta poderosa e versátil, especialmente útil para automatizar tarefas no ambiente Unix/Linux e aumentar a produtividade de desenvolvedores e administradores de sistemas. No entanto, para iniciantes, ele pode parecer um pouco intimidador devido à sua sintaxe e aos inúmeros comandos disponíveis.

Para ajudar a desmistificar essa linguagem de script e auxiliar aqueles que estão começando, reunimos uma série de perguntas frequentes que abordam desde conceitos básicos até práticas mais avançadas. Essas respostas visam esclarecer as principais dúvidas e facilitar o entendimento das funcionalidades e melhores práticas do Shell Script, tornando seu uso mais acessível e eficaz.

1. O que é Shell Script?

Shell Script é uma linguagem de script usada para automatizar tarefas no terminal de sistemas Unix/Linux. Ele permite a execução de comandos em sequência para automatizar processos, facilitar tarefas repetitivas e controlar o sistema operacional.

2. Qual a diferença entre Shell e Shell Script?

“Shell” é a interface de linha de comando que permite ao usuário interagir com o sistema operacional. “Shell Script” é um conjunto de comandos escritos em um arquivo executável que o Shell interpreta para automatizar tarefas.

3. Como criar um Shell Script?

Para criar um Shell Script, crie um arquivo de texto simples com a extensão .sh, insira os comandos desejados e comece o arquivo com #!/bin/bash (ou o Shell desejado). Em seguida, torne o arquivo executável com o comando chmod +x nome_do_arquivo.sh.

4. Como executar um Shell Script?

Para executar um Shell Script, digite ./nome_do_arquivo.sh no terminal. Lembre-se de estar no diretório correto ou fornecer o caminho completo do arquivo.

5. O que significa 2>&1 no Shell Script?

2>&1 é um redirecionamento que envia o erro padrão (stderr) para o mesmo destino da saída padrão (stdout), combinando ambas as saídas.

6. Para que serve #!/bin/bash no início do script?

#!/bin/bash indica qual Shell deve interpretar o script, neste caso, o Bash. É conhecido como “shebang” e define o ambiente de execução do script.

7. Como passar argumentos para um Shell Script?

Os argumentos são passados após o nome do script, e dentro do script eles são acessados como $1, $2, etc. Por exemplo, ./meu_script.sh argumento1 argumento2 acessa argumento1 como $1 e argumento2 como $2.

8. O que é if em Shell Script?

if é uma estrutura condicional que permite ao script executar comandos com base em condições. A estrutura básica é:

if [ condição ]; then
# comandos
fi

9. Como criar variáveis em Shell Script?

Para criar uma variável, basta atribuir um valor sem espaços: minha_variavel="valor". Para acessar o valor, use $minha_variavel.

10. Como faço para depurar um Shell Script?

Execute o script com bash -x nome_do_script.sh para exibir cada comando e seus resultados. Essa opção ajuda a entender o que está acontecendo em cada linha.

11. Como lidar com erros em um Shell Script?

Use estruturas de controle como if, &&, || ou set -e para detectar e lidar com erros. Redirecione erros para um arquivo ou use 2>/dev/null para suprimir erros.

12. Qual a função dos loops em Shell Script?

Loops como for, while e until permitem executar comandos repetidamente, facilitando operações em listas de arquivos, resultados de comandos, entre outros.

13. O que é echo e para que serve?

echo é um comando que exibe texto na tela ou em um arquivo. Ele é muito usado para imprimir mensagens e o valor de variáveis no terminal.

14. Posso usar funções em Shell Script?

Sim! Você pode definir uma função com nome_funcao() { comandos }. Funções ajudam a organizar o script e evitar duplicação de código.

15. O que é um redirecionamento em Shell Script?

Redirecionamento é o envio de saídas ou entradas de um comando para arquivos ou outros comandos. Exemplos incluem >, <, >>, 2>, &> e |.

Veja outras soluções de problemas do Windows e outros sistemas:

antonio-cesar-150x150
António César de Andrade

Apaixonado por tecnologia e inovação, traz notícias do seguimento que atua com paixão há mais de 15 anos.