Browse By

Prompt do Linux: stdin, stdout, stderr e seus truques (parte I)

Hoje, na série “Prompt do Linux”, falaremos sobre o stdin, o stdout e o stderr, e o que dá pra fazer quando entendemos o seu conceito. Como dá pra falar bastante a respeito, vou dividir o artigo em algumas partes.

Conceito

Todos os programas que fazem interface com o usuário precisam receber por algum meio as informações passadas por ele. O meio mais antigo e comum do usuário passar informações a um programa é via teclado. Por isto mesmo, ele é considerado a entrada padrão, e é daí que vem o nome stdin (STandarD INput, ou Entrada Padrão).

No Linux, em alguns programas, você passa as informações previamente, via parâmetros, antes de executá-lo. Em outros, você pode digitar as informações durante a execução, caso especifique que a entrada deve vir do stdin.

Na outra mão, temos o stdout (STandarD OUTput, ou Saída Padrão), que representa o monitor, já que ele é o dispositivo de saída padrão na interface com o usuário. Nesta saída, temos acesso a todas as mensagens de informação que o sistema gera na tela para o usuário. Ela pode ser representada pelo número 1.

Por fim, temos o stderr (STandarD ERRor, ou Erro Padrão), que também é apresentado no monitor, mas é por ele que são enviadas as mensagens de erro geradas pelos aplicativos. Ela pode ser representada pelo número 2.

A maioria dos programas em modo texto trabalham com estes “carinhas”, ou seja, aceitam entrada pelo stdin, mostram mensagens informativas pelo stdout, e mostram erros via stderr.

Operadores

Você pode manipular as entradas e saídas com estes três operadores:

Pipe ( | ): Liga o stdout de um programa ao stdin de outro.
Write ( > ): Redireciona o stdout para outro local (um arquivo, por exemplo).
Append ( >> ): Anexa o stdout para outro local (um arquivo, por exemplo).

Repare que há uma pequena diferença entre o “>” e o “>>”: o primeiro apaga o conteúdo do destino, para então escrever seus dados; o segundo apenas acrescenta as informações às já existentes.

Legal, mas o que eu faço com isto?

Ora, dá pra fazer muita coisa!!! Se você entendeu o conceito, e se você conhecer alguns comandos úteis (assunto para o próximo artigo), dá para fazer muitas coisas interessantes usando estes operadores e conceitos. Alguns exemplos pra começar:

– Enviar a saída do comando ls para o arquivo “lista.txt”:
$ ls > lista.txt
– Semelhante ao comando acima, mas preservando o conteúdo original do arquivo “lista.txt”:
$ ls >> lista.txt
– Obter uma lista do tamanho (em MiB) ocupado por cada arquivo na pasta atual e subpastas, e classificar a relação do maior para o menor:
$ du -m | sort -nr

Em todos estes casos, trabalhamos apenas com stdout e stdin. Para trabalhar com a stderr, a coisa fica assim (repare no “2”):

– Remover todos os arquivos em /home, listando um por um, e fazer log dos erros no arquivo /tmp/erros.txt:
$ rm -rfv /home 2> /tmp/erros.txt
– Mesmo caso acima, mas as mensagens de informação irão para o arquivo /tmp/info.txt:
$ rm -rfv /home 1> /tmp/info.txt 2> /tmp/erros.txt
– Outra abordagem do mesmo problema, mas desta vez, tudo irá para o arquivo /tmp/info.txt:
$ rm -rfv /home 1> /tmp/info.txt 2>&1

Isto é só um pouquinho do que dá pra fazer. No(s) próximo(s) artigo(s), vou abordar alguns comandos muito úteis para trabalhar com textos no shell, incluindo localização de padrões, substituição de texto, filtragem de conteúdo, entre outros.

Até mais!

<
  • Paulo Ricardo

    Uau! Continue com esta série de artigos, estão sensacionais! 🙂

    Mesmo que eu já saiba tudo isso, para quem está começando este material é deveras informativo. Apesar de ser somente o básico, já é um baita conhecimento agregado. Sem contar com a linguagem descomplicada e os exemplos elucidativos. 😀

    Parabéns! 😉

    Legal, mas o que eu faço com isto?

    Muita coisa mesmo! 🙂

    Nos meus projetos interativos em bash costumo usar muito comandos com > /dev/null 2>&1 e depois checar o valor do $?. Isso me dá um controle perfeito. 😛

    []’s 😀

  • Pingback: Guia do PC » Prompt do Linux: stdin, stdout, stderr e seus truques (parte II)()

  • Luciano

    Ótimo artigo!
    Parabéns!

  • STI

    Você poderia pegar um outro exemplo do que apagar os arquivos do /home.

    É só um toque!!

    Abraço

  • Érico Fusco

    Olá amigo, só corrigindo o seu artigo, o monitor não é uma STDOUT e sim a placa de vídeo, monitor é apenas um periférico que irá mostrar o que a placa de vídeo está transmitindo.

  • Felipe

    Se for seguir esse raciocínio o stdout seria o slot, que envia as informações da placa mãe para a placa de vídeo, que por sua vez joga pra tela… É o monitor mesmo cara. 🙂

  • Tiago Gonçalve

    Boa! muito bom, só os exemplo de redirecionamento de entrada e saída de dados deixaram a desejar, poderia ser outro ou outra pasta diferente de /home
    ls 1> arquivo
    make 2> arquivoErro
    make 2 >> arquivoErro

  • zewilla

    Muito bom! Parabéns! Custei a achar explicações tão claras sobre os operadores!!