Eu estava no Termux, um emulador de terminal para Android, rodando uns comandos básicos de estudo, quando digitei algo simples:
ls > arquivos.txt
Não aconteceu nada. O terminal ficou em silêncio.
Meu primeiro instinto foi achar que o comando tinha falhado. Mas quando rodei cat arquivos.txt, o conteúdo estava lá, o ls tinha funcionado, só que a saída não foi para a tela. Foi para dentro do arquivo.
Esse momento me fez querer entender o que estava acontecendo por baixo. Este artigo é o resultado disso.
Os três canais de todo comando Linux
Antes de falar em pipes e redirecionamento, preciso falar sobre como o Linux enxerga a comunicação de um programa.
Todo processo no Linux tem três canais abertos por padrão:
| Canal | Número | O que é |
|---|---|---|
| stdin | 0 | Entrada de dados |
| stdout | 1 | Saída normal |
| stderr | 2 | Saída de erros |
Por padrão, stdout e stderr aparecem na tela, e stdin vem do teclado. Mas você pode mudar isso e é aí que a mágica acontece.
Redirecionamento de saída com >
O operador > redireciona o stdout de um comando para um arquivo.
ls > arquivos.txt
O que acontece aqui:
• ls gera a listagem de arquivos (stdout)
• > intercepta essa saída antes de chegar na tela
• O conteúdo vai para dentro de arquivos.txt
• Se o arquivo não existir, ele é criado
• Se já existir, o conteúdo anterior é sobrescrito
Para adicionar ao invés de sobrescrever, use >>:
ls >> arquivos.txt
Redirecionando erros com 2>
O canal de erros é separado do canal de saída. Para capturá-lo, você usa 2>.
cat arquivo_que_nao_existe.txt 2> erro.txt
Tente rodar os dois e compare:
# Isso imprime o erro na tela
cat arquivo_que_nao_existe.txt
# Isso salva o erro em um arquivo (nada aparece na tela)
cat arquivo_que_nao_existe.txt 2> erro.txt
# Confirme que o erro foi salvo
cat erro.txt
Isso é útil quando você roda um script longo e quer guardar os erros para analisar depois, sem poluir a saída normal.
Juntando stdout e stderr no mesmo arquivo
Às vezes você quer capturar tudo, saída e erro, no mesmo lugar:
comando > tudo.txt 2>&1
O 2>&1 significa: "redirecione o canal 2 (stderr) para onde o canal 1 (stdout) estiver indo."
A ordem importa. Isso aqui não funciona como esperado:
# Ordem errada — resultado não é o que você espera
comando 2>&1 > tudo.txt
Nessa ordem, o 2>&1 é avaliado primeiro — quando ainda não há redirecionamento de stdout, então o stderr é vinculado à tela. Depois o > tudo.txt redireciona só o stdout para o arquivo. Resultado: o arquivo recebe apenas o stdout, e o stderr continua aparecendo na tela. O inverso do que você queria.
Pipes com |: compondo
O pipe | conecta a saída de um comando à entrada do próximo. É como criar uma linha de montagem.
ls -l | grep ".txt"
O que acontece:
- ls -l lista todos os arquivos com detalhes
- | passa essa saída como entrada para o grep
- grep ".txt" filtra e mostra só as linhas que contêm .txt Outro exemplo prático, procurar um processo em execução:
ps aux | grep java
Você pode encadear quantos pipes quiser:
cat arquivo.txt | sort | uniq | wc -l
Isso lê um arquivo, ordena as linhas, remove duplicatas e conta quantas restaram, tudo em um único comando.
tee: saída na tela e no arquivo ao mesmo tempo
O > escolhe entre tela ou arquivo. O tee faz os dois:
ls | tee listagem.txt
A saída aparece na tela e é salva no arquivo simultaneamente. Útil quando você quer acompanhar o que está acontecendo em tempo real e ainda guardar o resultado.
Resumo visual
comando → stdout → tela (padrão)
comando > arquivo → stdout → arquivo
comando >> arquivo → stdout → arquivo (acumula)
comando 2> erros → stderr → arquivo
comando 2>&1 → stderr → mesmo lugar que stdout
cmd1 | cmd2 → stdout do cmd1 → stdin do cmd2
cmd | tee arquivo → stdout → tela e arquivo
Por que isso importa
Esses conceitos parecem simples, mas são a base de como scripts shell funcionam, como logs são gerados, como pipelines de dados são construídos, e como você compõe ferramentas pequenas para resolver problemas grandes.
No Linux, cada ferramenta faz uma coisa bem feita. Pipes e redirecionamento são o que permite combiná-las.
Comecei a entender isso rodando um ls no Termux às 19h num sábado. Às vezes o aprendizado começa em lugares assim.
Top comments (1)
Some comments may only be visible to logged-in visitors. Sign in to view all comments.