DEV Community

Cover image for Pipes e Redirecionamento no Linux: o que eu aprendi estudando o terminal no celular
Ewerson Benigno
Ewerson Benigno

Posted on

Pipes e Redirecionamento no Linux: o que eu aprendi estudando o terminal no celular

Eu estava no Termux, um emulador de terminal para Android, rodando uns comandos básicos de estudo, quando digitei algo simples:

ls > arquivos.txt
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

O que acontece:

  1. ls -l lista todos os arquivos com detalhes
  2. | passa essa saída como entrada para o grep
  3. 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
Enter fullscreen mode Exit fullscreen mode

Você pode encadear quantos pipes quiser:

cat arquivo.txt | sort | uniq | wc -l
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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.