Introdução
As capacidades de redirecionamento incorporadas no Linux fornecem um conjunto robusto de ferramentas para otimizar muitos fluxos de trabalho. A “filosofia Unix” de desenvolvimento de software era fazer ferramentas que façam uma coisa bem, e essa filosofia foi levada adiante para as ferramentas modernas de linha de comando, que são individualmente poderosas e exponencialmente mais 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, pode seguir nosso guia sobre como conectar-se a um servidor Linux usando SSH.
Fluxos
A entrada e saída no ambiente Linux estão distribuídas em 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 irá imprimir texto diretamente no terminal. Tente imprimir algum texto arbitrário usando o comando echo
:
OutputSent to the terminal
Quando usado sem nenhuma opção adicional, o comando echo
imprime qualquer argumento que lhe seja passado na linha de comando.
Execute o echo sem nenhum argumento:
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 esse 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 argumento, 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.
Como % não é um diretório existente, isso enviará o seguinte texto para o erro padrão:
Outputls: 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 o 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.
Acrescentar
-
>> – 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:
Isso leva a saída do ls
, que exibe o conteúdo do diretório atual, e a tubos para o programa less
. 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 exclusivamente para redirecionar para arquivos.
Filtros
Os filtros são uma classe de programas comumente usados com a saída encaminhada de outro programa. Muitos deles também são úteis por si só, mas ilustram especialmente bem o comportamento de encaminhamento.
-
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 tanto para a saída padrão quanto para um ou mais arquivos.
-
tr – encontra e substitui uma string por outra.
-
wc – conta caracteres, linhas e palavras.
Exemplos
Agora que você foi apresentado à redireção, encaminhamento e filtros básicos, vamos dar uma olhada em alguns padrões de redireção comuns e exemplos.
O padrão comando > arquivo
redireciona a saída padrão de um comando para um arquivo.
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 comando > /dev/null
redireciona a saída padrão para nenhum lugar. /dev/null
é um arquivo especial usado para descartar quaisquer dados redirecionados 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.
Este comando descarta o fluxo de saída padrão retornado pelo comando ls ao passá-lo para /dev/null.
O padrão comando 2> arquivo
redireciona o fluxo de erro padrão de um comando para um arquivo, sobrescrevendo os conteúdos existentes.
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 comando >> arquivo
redireciona a saída padrão de um comando para um arquivo sem sobrescrever os conteúdos existentes no arquivo.
Este par de comandos primeiro redireciona o texto inserido pelo usuário através do echo para um novo arquivo. Em seguida, anexa o texto recebido pelo segundo comando echo ao arquivo existente, sem sobrescrever seus conteúdos.
O padrão command 2>> file
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, já que o arquivo de log não terá seu conteúdo anterior apagado cada vez que o arquivo for gravado.
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, ele anexa a mensagem de erro causada por um argumento inválido do comando wc ao mesmo arquivo.
O padrão command | command
redireciona a saída padrão do primeiro comando para a entrada padrão do segundo comando.
Este comando busca em /var e suas subpastas por nomes de arquivos e extensões que correspondam à string deb
, e retorna os caminhos dos arquivos, com a parte correspondente em cada caminho destacada em vermelho.
O padrão command | tee file
(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 deste padrão, tee
é tipicamente usado para visualizar a saída de um programa enquanto a salva simultaneamente em um arquivo.
Isso encaminha as contagens de caracteres, linhas e palavras no arquivo /etc/magic
(usado pelo shell Linux para determinar tipos de arquivo) para o comando tee, que então divide a saída do wc
em duas direções e a envia para o terminal e 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). Múltiplos pipes podem ser usados para redirecionar a saída por 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 funcionam os redirecionamentos e os pipes, poderá iniciar sua jornada no mundo do scripting de shell, que faz uso frequente dos programas e padrões destacados neste guia.
Buscar 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