Entendendo stdin, stdout e stderr
O Que São os Fluxos Padrão?
Salvar um log com > arquivo, encadear comandos com um | (pipe) — à medida que você aprende a linha de comando, continua encontrando esses símbolos. Por trás deles está um mecanismo chamado fluxos padrão: stdin, stdout e stderr.
Este guia desembaraça o que cada um dos três fluxos é, por que a saída é dividida em dois tipos, e como trocar para onde a entrada e saída vão usando redirecionamento e pipes — tudo por meio de uma conversa entre Lina e Veterano Linny.
O Que Você Vai Aprender
- Do que cada um de stdin, stdout e stderr é responsável
- Por que a saída é dividida em dois fluxos (stdout e stderr)
- O significado dos números 0 / 1 / 2 (descritores de arquivo)
- Como trocar destinos com
>,2>e&> - Como usar o pipe
|e o redirecionamento de entrada<
1. O Que São os Fluxos Padrão?
Conclusão: Os fluxos padrão são três caminhos padrão que um comando usa — um para receber entrada, um para enviar resultados normais e um para enviar erros. Eles são chamados de stdin, stdout e stderr.
- stdin (entrada padrão): a entrada por onde os dados chegam ao comando
- stdout (saída padrão): a saída para resultados normais
- stderr (saída de erro padrão): a saída para erros e avisos
O que "padrão" significa
"Padrão" significa "o caminho padrão usado a menos que você diga o contrário". Por exemplo, o resultado de ls aparece na tela porque o destino padrão do stdout é a tela (o terminal). Redirecionamento e pipes são simplesmente formas de mudar esse destino depois.
2. Por Que a Saída É Dividida em stdout e stderr?
Conclusão: Para manter "resultados que você quer passar adiante" separados de "erros que você quer que um humano leia". Dividi-los permite salvar apenas os resultados ou capturar apenas os erros.
- stdout = resultados normais (dados que você quer passar adiante ou salvar)
- stderr = erros e avisos (mensagens destinadas a um humano)
Assim, mesmo que você salve os resultados em um arquivo, os erros ainda aparecem na tela para que você não os perca.
Uma analogia familiar
Em uma linha de fábrica, stdout é a "esteira rolante que carrega produtos acabados", e stderr é o "alarme que sinaliza um defeito". Você não quer o som do alarme dentro da caixa de produtos acabados (o arquivo). Por isso são mantidos separados.
3. O Que São os Números 0 / 1 / 2?
Conclusão: stdin, stdout e stderr recebem os números 0 / 1 / 2 (descritores de arquivo). O
2em2>se refere a esse número.
2> em um exemplo — o que é esse 2?| Número | Nome | Função |
|---|---|---|
| 0 | stdin | Entrada padrão (entrada) |
| 1 | stdout | Saída padrão (saída normal) |
| 2 | stderr | Erro padrão (saída de erro) |
Como os números se mapeiam para símbolos
Os símbolos de redirecionamento se conectam diretamente a esses números.
>é abreviação de1>(envia stdout)2>envia stderr<é abreviação de0<(lê stdin)
Assim que você lembrar "o 2 em 2> é o número do stderr", os símbolos passam a fazer sentido.
4. Como Eu Mudo Para Onde a Saída Vai?
Conclusão: Use
>para enviar stdout e2>para enviar stderr para um arquivo. Para combinar ambos, use> arquivo 2>&1ou&> arquivo.
ls /etc > filelist.txt
Com >, o conteúdo de stdout que teria aparecido na tela é escrito em filelist.txt (nada aparece na tela). Note que > sobrescreve, enquanto >> anexa.
Para salvar apenas os erros, use 2>.
ls /not-exist 2> errors.txt
(nada aparece na tela; errors.txt registra o seguinte) ls: cannot access '/not-exist': No such file or directory
> e stderr é 2>. E se eu quiser ambos em um arquivo?2>&1. Significa "enviar stderr (2) para o mesmo destino que stdout (1)."command > output.txt 2>&1
A ordem importa com 2>&1
2>&1 significa "fazer stderr corresponder ao destino atual de stdout". Então você deve escrever > output.txt primeiro. Se você inverter a ordem, como command 2>&1 > output.txt, stderr fica apontado para seu destino antigo (a tela). A notação mais recente &> arquivo (bash) combina ambos sem se preocupar com a ordem.
command &> output.txt
5. Como Pipes e Entrada Padrão Funcionam?
Conclusão: Um pipe
|conecta o stdout do comando da esquerda ao stdin do comando da direita.<alimenta o conteúdo de um arquivo como stdin.
| conecta o stdout do comando da esquerda diretamente ao stdin do comando da direita.ls /etc | grep conf
Neste exemplo, a saída (stdout) de ls /etc flui diretamente para a entrada (stdin) de grep conf. O grep então seleciona apenas as linhas que contêm conf.
Visualize o fluxo
ls /etc ──stdout──▶ | ──stdin──▶ grep conf ──stdout──▶ tela
Um pipe é como uma mangueira que conecta "a saída do comando anterior" diretamente à "entrada do próximo comando".
Para alimentar o conteúdo de um arquivo como stdin, use <.
sort < names.txt
Isso transmite o conteúdo de names.txt para a entrada padrão do sort, que os ordena e imprime. O resultado é o mesmo que sort names.txt, mas torna fácil visualizar o comportamento de "conectar um arquivo ao stdin" da entrada padrão.
Para praticar pipes e redirecionamento de forma mais prática, veja Fundamentos de Pipes e Redirecionamento. Quando você quiser que a saída vá tanto para a tela quanto para um arquivo, o comando tee é útil.
Resumo
- Os fluxos padrão são três caminhos: stdin (entrada), stdout (saída normal) e stderr (saída de erro)
- Há dois fluxos de saída para evitar a mistura de "resultados" e "erros"
- Os três recebem os números 0 / 1 / 2 (descritores de arquivo)
- Use
>para stdout e2>para stderr para enviá-los a um arquivo (ambos com> arquivo 2>&1ou&> arquivo) - Um pipe
|conecta stdout ao próximo stdin, e<alimenta um arquivo como stdin