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

Publicado em 28/12/2007, 16h30 por Daniel Carmo Olops
Modificado pela última vez em 28/12/2007, 16h38.

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!

Sobre o autor

Daniel Carmo Olops. Sou graduando em Ciência da Computação, e atualmente trabalho para a Faculdade de Jaguariúna na área de Informática, administrando servidores Linux e também as atividades do setor. Tenho uma relação de quase 10 anos com a informática, e tenho conhecimentos em diversas áreas e softwares, a maioria deles adquirido em fóruns ou através de empirismo (o chamado "se vira").

Comentários

4 comentários para “Prompt do Linux: stdin, stdout, stderr e seus truques (parte I)”
  1. Paulo Ricardo  Add rating 0  Subtract rating 0  

    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. :D

    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. :P

    []’s :D

  2. Luciano  Add rating 0  Subtract rating 0  

    Ótimo artigo!
    Parabéns!

  3. STI  Add rating 0  Subtract rating 0  

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

    É só um toque!!

    Abraço

Trackbacks e Pingbacks

Veja o que os outros estão dizendo sobre este texto. Tem um blog e quer aparecer aqui? Envie um trackback ou pingback para este texto. Saiba mais sobre isso.
  1. [...] Obs.: para um melhor entendimento deste artigo, leia o anterior: Prompt do Linux: stdin, stdout, stderr e seus truques (parte I). [...]



Escreva um comentário

Pronto para dar sua opinião? Caso queira uma foto para exibir no seu comentário, envie uma imagem de sua preferência para o serviço Gravatar.

XHTML: Você pode utilizar as seguintes tags XHTML para formatar seu comentário: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>