Redirecionamentos e Condutores no Linux [Guia Básico]
Um conceito importante no Linux é o redirecionamento. Como tudo no Linux é um arquivo, fez-se necessário que os comandos e processos tivessem a habilidade de tratar as entradas e saídas de dados com grande facilidade.
Antes de detalharmos a habilidade de redirecionamento do Linux precisamos definir o que são entradas padrão, saída padrão e saída de erro.
Entrada padrão stdin -> 0
A Entrada Padrão (stdin) é a entrada de um fluxo de texto. Como exemplos temos o teclado, o mouse, um pendrive, etc. Todos eles alimentam o computador com informações. Pode ser representado pelo número 0.
Saída padrão stdout -> 1
A Saída Padrão (stdout) é a saída de um fluxo de texto em condições normais. Como exemplos temos o monitor, a impressora, o disquete, um arquivo, etc. Todos eles recebem informações do computador. Pode ser representado pelo número 1.
Saída de erros stderr -> 2
A Saída de Erro (stderr) é a saída de um fluxo de texto em condições de erro ou insucesso em um determinado processamento. A saída de erro poderá ser direcionada para o monitor ou para um arquivo de LOG. Pode ser representado pelo número 2.
Podemos redirecionar a entrada padrão ou a saída padrão do fluxo de dados de um determinado processo para outro processo ou um arquivo com muita facilidade.
Redirecionar para arquivos com > ou >>
Para redirecionar um resultado de uma saída para outra saída utilizamos o sinal de maior (>) ou (>>).
O sinal > simplesmente regrava o arquivo de saída; Já o sinal >> adiciona a saída no final do arquivo, sem apagar o conteúdo.
Redirecionar a partir de arquivos com o < ou
e para direcionarmos uma entrada para outra entrada usamos o sinal de menor (<).
Condutores… conduzem algo de um processo a outro ( | ou pipe)
Ainda podemos redirecionar uma saída para uma entrada usando uma barra vertical especial, o sinal em inglês chamado “pipe” (|) ou duto.
$ ls > saida.txt
Neste exemplo listamos os arquivos em um diretório gravando o resultado no arquivo saída.txt.
O redirecionamento é utilizando principalmente por programas ou quando o resultado de um processamento não será observado diretamente pelo usuário, mas enviado para outro programa, para um arquivo ou para um dispositivo.
$ mail [email protected] < e-mail.txt
Aqui o programa mail está recebendo como argumento o endereço de e-mail e ao invés de utilizarmos o teclado como entrada padrão, estamos redirecionando o arquivo texto e-mail.txt.
$ ./folha_pagamento > arquivo1
Ou
$ ./folha_pagamento 1 > arquivo1
Estamos enviando toda a saída do programa folha_pagamento para o arquivo1
$ ./folha_pagamento 2 > arquivo_erro.log
Estamos enviando toda a saída de erros para o arquivo arquivo_ erro.log.
$ ./folha_pagamento > arquivo1 2>&1
Estamos enviando toda a saída padrão e de erros para o arquivo arquivo1.
$ ./folha_pagamento > arquivo_sucesso.log 2> arquivo_erro.log
Estamos enviando o resultado com a saída normal para o arquivo_ sucesso.log e a saída de erro para o arquivo_erro.log.
$ ./folha_pagamento | imprime_boletos 2> erros.log
Estamos enviando o resultado do processo folha_pagamento para o processo imprime_boletos e a saída de erro do imprime_boletos para o arquivo erro.log.
Símbolos Coringa
Veja que você também pode usar símbolos coringa para aglutinar arquivos pelo nome ou pedaços de nome.
Veja a tabela a seguir
TABELA – Símbolos Coringa (Wildcards)
Símbolo | Descrição |
* | Significa “vale qualquer coisa” e pode substituir um ou mais caracteres de um nome. Por exemplo “Certifi*” pode significar “Certificado”, “Certificação” ou qualquer outra combinação de nomes de arquivos que inicie com “Certifi”. |
? | Significa que pode substituir um caractere somente de um nome. Por exemplo: “?ertificado” pode substituir “Certificado”, “certificado” ou qualquer outra combinação de nomes de arquivos que inicie com um caracter qualquer e termine com “certificado”. |
{texto1, texto2…} | Substitui a parte dentro das chaves pelos texto1, depois pelo texto2, assim por diante. Por exemplo: “parte_{a,b,c}” vai resultar em “parte_a”, “parte_b” e “parte_c”. |
Quando estamos trabalhando com arquivos e diretórios no shell é muito comum precisarmos trabalhar com diversos arquivos de uma vez.
Para tornar este tipo de tarefa mais simples, o Linux oferece o recurso de coringa para os nomes dos arquivos e diretórios.
Assim como no baralho de cartas, os coringas são símbolos que podem significar muitas coisas. No Linux possibilitam que você os utilize como parte do nome dos arquivos e diretórios. Veja a tabela 6, de coringas:
Exemplos:
$ ls *.txt
Lista todos os arquivos com o sufixo .txt
$ cat doc??? >> documentos
Concatena todos os arquivos iniciados com “doc” que tenham 6 caracteres de tamanho no arquivo documentos.
Conheça agora um comando especial que permite que a saída de um comando possa ao mesmo tempo ser gravada em arquivo e enviada para outro comandao.
Comando tee
Uso:
$ tee [opções] arquivos
O comando tee recebe dados de uma entrada padrão, grava o que recebeu em um arquivo e ainda envia para sua saída padrão.
É utilizado para gravar a saída padrão de um comando em um arquivo e ainda enviar esta saída para outro comando.
A opção é:
- -a: Adiciona no final do arquivo o que foi recebido ao invés de gravar por cima.
Exemplo:
$ folha_pagamento | tee folha.txt | imprime_boleto | tee boleto.txt | lpr 2> erros.log
O resultado do programa folha_pagamento é gravado pelo tee no arquivo folha.txt e enviado para o programa imprime_boleto.
Por sua vez o programa imprime_boleto redireciona sua saída para o segundo tee que grava o resultado no arquivo boleto.txt que também é enviado para o programa lpr que imprime os boletos.
Se houver erro na impressão, este erro é gravado no arquivo erros.log.
Há um outro comando especial que passa o que recebeu como entrada como argumentos para um determinado comando.
Comando xargs
Uso:
$ xargs comando [opções] arqumentoinicial
O xargs executa o comando e passa como argumento para esse comando o que foi recebido como entrada padrão.
O xargs vai executar inúmeras vezes comando de acordo com o número de linhas recebidas como entrada padrão.
As opções mais frequentes são:
- -p: Pergunte ao usuário se o comando deve ser executado antes de fazê-lo
- -r: Não execute o comando quando receber linhas vazias
- -t: Mostre o comando na tela antes de executá-lo
Exemplos:
$ cat LEIAME.TXT | xargs echo
Neste exemplo cada linha do arquivo LEIAME.TXT é passada como argumento para o comando echo.
O comando echo imprime na saída padrão os argumentos recebidos.
$ cat lista-de-usuários.txt | xargs mkdir
Neste exemplo o comando xargs irá criar um diretório executando o mkdir com o nome da cada usuário contido no arquivo lista-de-usuários.txt.
$ ls -1 *.gz > lista-de-arquivo-zipado.txt
$ cat lista-de-arquivo-zipado.txt | guzip
Neste exemplo a primeira linha lista todos os arquivos com sufixo .gz e manda para o arquivo lista-de-arquivo-zipado.txt.
Na segunda linha o xargs irá executar o “gunzip” com cada arquivo da lista.
Assista o vídeo abaixo que não vai restar nenhuma dúvida:
Aprenda muito mais sobre Linux em nosso curso online. Você pode efetuar a matrícula aqui. Se você já tem uma conta, ou quer criar uma, basta entrar ou criar seu usuário aqui.
Gostou? Compartilhe
Tag:condutores, pipe, redirecionamento, stderr, stdin, stout, tee, xargs