Uma introdução à Redirecionamento de E/S no Linux

Introdução

As capacidades de redirecionamento incorporadas no Linux fornecem a você um conjunto robusto de ferramentas para otimizar muitos fluxos de trabalho. A “filosofia Unix” de desenvolvimento de software era criar ferramentas que cada uma fizesse uma coisa bem, e essa filosofia foi levada adiante para as modernas ferramentas de linha de comando, que são individualmente poderosas e exponencialmente mais poderosas quando combinadas. Seja escrevendo software complexo ou apenas trabalhando na linha de comando, saber como manipular os diferentes fluxos de E/S em seu ambiente aumentará muito sua produtividade.

Pré-requisitos

Para acompanhar este guia, você precisará ter acesso a um servidor Linux. Se precisar de informações sobre como se conectar ao seu servidor pela primeira vez, você pode seguir nosso guia sobre como se conectar a um servidor Linux usando SSH.

Fluxos

A entrada e saída no ambiente Linux são distribuídas entre três fluxos. Esses fluxos são:

  • entrada padrão (stdin)

  • saída padrão (stdout)

  • erro padrão (stderr)

Os fluxos também são numerados:

  • stdin (0)

  • stdout (1)

  • stderr (2)

Durante as interações padrão entre o usuário e o terminal, a entrada padrão vem do teclado do usuário. A saída padrão e o erro padrão são exibidos no terminal do usuário como texto. Coletivamente, os três fluxos são referidos como os fluxos padrão.

Entrada Padrão

O fluxo de entrada padrão normalmente transporta dados de um usuário para um programa. Programas que esperam entrada padrão geralmente recebem entrada de um dispositivo, como um teclado. Mais tarde neste tutorial, você verá exemplos de como usar a saída de um programa como Entrada Padrão para outro.

Saída Padrão

A saída padrão é a saída gerada por um programa. Quando o fluxo de saída padrão não é redirecionado, ele enviará o texto diretamente para o terminal. Tente produzir algum texto arbitrário usando o comando echo:

  1. echo Sent to the terminal
Output
Sent to the terminal

Quando usado sem opções adicionais, o comando echo exibe qualquer argumento que lhe seja passado na linha de comando.

Execute o echo sem argumentos:

  1. echo

Ele retornará uma linha vazia. Alguns programas não fazem nada sem argumentos fornecidos.

Erro Padrão

O erro padrão contém erros gerados por um programa que falhou de alguma forma. Assim como a saída padrão, o destino padrão para este fluxo é a exibição no terminal.

Vamos ver um exemplo básico de erro padrão usando o comando ls. ls lista o conteúdo de um diretório.

Quando executado sem argumentos, o ls lista o conteúdo dentro do diretório atual. Se o ls for executado com um diretório como argumento, ele listará o conteúdo do diretório fornecido.

  1. ls %

Como % não é um diretório existente, isso enviará o seguinte texto para o erro padrão:

Output
ls: cannot access %: No such file or directory

A program does not have to crash or finish running in order to generate Standard Error, and whether some output is sent to either Standard Output or Standard Error is down to the behavior of the program. They are not technically different from one another in any way — just that one output stream is supposed to be reserved for error messages, and some tools will assume that Standard Error being empty means that a program ran successfully. Some programs will even output minor errors to Standard Error without crashing or failing to also produce the intended output. It is only used as a convention to separate intended output from unintended output.

Redirecionamento de Fluxo

O Linux inclui comandos de redirecionamento para cada fluxo. Estes podem ser usados para escrever a saída padrão ou erro padrão em um arquivo. Se você escrever em um arquivo que não existe, um novo arquivo com esse nome será criado antes da escrita.

Comandos com um único colchete sobrescrevem o conteúdo existente do destino.

Sobrescrever

  • > – saída padrão

  • < – entrada padrão

  • 2> – erro padrão

Comandos com um duplo colchete não sobrescrevem o conteúdo existente do destino.

Anexar

  • >> – saída padrão

  • << – entrada padrão

  • 2>> – erro padrão

Tubos

Tubos são usados para redirecionar um fluxo de um programa para outro. Quando a saída padrão de um programa é enviada para outro através de um tubo, a saída do primeiro programa será usada como entrada para o segundo, em vez de ser impressa no terminal. Apenas os dados retornados pelo segundo programa serão exibidos.

O tubo do Linux é representado por uma barra vertical: |

Aqui está um exemplo de um comando usando um tubo:

  1. ls | less

Isso pega a saída do ls, que exibe o conteúdo do seu diretório atual, e a tubula para o programa less. O less exibe os dados enviados a ele uma linha de cada vez.

ls normalmente exibe o conteúdo do diretório em várias linhas. Quando você o executa através do less, cada entrada é colocada em uma nova linha.

Embora a funcionalidade do tubo possa parecer semelhante à de > e >>, a distinção é que os tubos redirecionam dados de um comando para outro, enquanto > e >> são usados para redirecionar exclusivamente para arquivos.

Filtros

Filtros são uma classe de programas comumente usados com a saída direcionada de outro programa. Muitos deles também são úteis por si só, mas ilustram especialmente bem o comportamento de direcionamento.

  • find – retorna arquivos com nomes de arquivo que correspondem ao argumento passado para find.

  • grep – retorna texto que corresponde ao padrão de string passado para grep.

  • tee – redireciona a entrada padrão para tanto a saída padrão quanto um ou mais arquivos.

  • tr – encontra e substitui uma string por outra.

  • wc – conta caracteres, linhas e palavras.

Exemplos

Agora que você foi apresentado ao redirecionamento, direcionamento e filtros básicos, vamos olhar para alguns padrões e exemplos comuns de redirecionamento.

O padrão command > arquivo redireciona a saída padrão de um comando para um arquivo.

  1. ls ~ > root_dir_contents.txt

O comando acima passa o conteúdo do seu diretório home (~) como saída padrão e escreve a saída em um arquivo chamado root_dir_contents.txt. Ele irá excluir quaisquer conteúdos anteriores no arquivo, pois é um comando de único colchete.

O padrão command > /dev/null redireciona a saída padrão para lugar nenhum. /dev/null é um arquivo especial usado para descartar qualquer dado redirecionado para ele. É usado para descartar a saída padrão que não é necessária e que de outra forma poderia interferir na funcionalidade de um comando ou script. Qualquer saída enviada para /dev/null é descartada.

  1. ls > /dev/null

Este comando descarta o fluxo de saída padrão retornado pelo comando ls ao passá-lo para /dev/null.

O padrão command 2> arquivo redireciona o fluxo de erro padrão de um comando para um arquivo, sobrescrevendo os conteúdos existentes.

  1. mkdir '' 2> mkdir_log.txt

Isso redireciona o erro gerado pelo nome de diretório inválido '' e o escreve em log.txt. Observe que o erro ainda é enviado para o terminal e exibido como texto.

O padrão command >> arquivo redireciona a saída padrão de um comando para um arquivo sem sobrescrever os conteúdos existentes do arquivo.

  1. echo Written to a new file > data.txt
  2. echo Appended content to an existing file >> data.txt

Este par de comandos primeiro redireciona a entrada de texto inserida pelo usuário por meio do echo para um novo arquivo. Em seguida, anexa o texto recebido pelo segundo comando echo ao arquivo existente, sem sobrescrever seu conteúdo.

O padrão command 2>> arquivo acima redireciona o fluxo de erro padrão de um comando para um arquivo sem sobrescrever o conteúdo existente do arquivo. Este padrão é útil para criar registros de erro para um programa ou serviço, pois o arquivo de log não terá seu conteúdo anterior apagado cada vez que o arquivo for escrito.

  1. find '' 2> stderr_log.txt
  2. wc '' 2>> stderr_log.txt

O comando acima redireciona a mensagem de erro causada por um argumento inválido do comando find para um arquivo chamado stderr_log.txt. Em seguida, anexa a mensagem de erro causada por um argumento inválido do wc ao mesmo arquivo.

O padrão command | comando redireciona a saída padrão do primeiro comando para a entrada padrão do segundo comando.

  1. find /var lib | grep deb

Este comando pesquisa em /var e suas subpastas por nomes de arquivo e extensões que correspondem à string deb e retorna os caminhos dos arquivos, com a parte correspondente em destaque em vermelho.

O padrão command | tee arquivo (que inclui o comando tee) redireciona a saída padrão do comando para um arquivo e sobrescreve seu conteúdo. Em seguida, ele exibe a saída redirecionada no terminal. Ele cria um novo arquivo se o arquivo ainda não existir.

No contexto desse padrão, tee é tipicamente usado para visualizar a saída de um programa enquanto simultaneamente a salva em um arquivo.

  1. wc /etc/magic | tee magic_count.txt

Isso encaminha as contagens de caracteres, linhas e palavras no arquivo /etc/magic (usado pelo shell Linux para determinar tipos de arquivos) para o comando tee, que então divide a saída do wc em duas direções, enviando-a para a exibição no terminal e para o arquivo magic_count.txt. Para o comando tee, imagine a letra T. A parte inferior da letra é os dados iniciais, e a parte superior são os dados sendo divididos em duas direções diferentes (saída padrão e o terminal). Vários pipes podem ser usados para redirecionar a saída através de vários comandos e/ou filtros.

Conclusão

Aprender como usar as capacidades de redirecionamento integradas na linha de comando do Linux é uma habilidade crucial. Agora que você viu o básico de como redirecionamentos e pipes funcionam, você será capaz de começar sua jornada no mundo do shell scripting, que faz uso frequente dos programas e padrões destacados neste guia.

Procurar por comandos específicos, ou por algo que você gostaria de fazer na linha de comando (por exemplo, “excluir todos os arquivos em um diretório que começam com uma letra maiúscula”) também pode ser útil quando você precisa realizar uma tarefa específica usando a linha de comando.

Source:
https://www.digitalocean.com/community/tutorials/an-introduction-to-linux-i-o-redirection