Pipes e Redirecionamento: Entendendo o Fluxo de Dados no Linux

Pipes e Redirecionamento: Entendendo o Fluxo de Dados no Linux

O que você vai conseguir fazer

  • Salvar e adicionar a saída em um arquivo com `>` e `>>`
  • Encadear comandos com `|` para transformar o resultado
  • Separar ou juntar a saída de erro com `2>` e `2>&1`

Pré-requisitos (leia estes primeiro)

O Que Você Vai Aprender

  • O conceito de "fluxo de dados" no Linux
  • A diferença entre | (pipe) e > >> (redirecionamento)
  • Como lidar com stdout e stderr separadamente
  • Como combinar grep, sort e outras ferramentas encadeando pequenos comandos

Resumo Rápido

  • Para salvar a saída em um arquivo, use > ou >>.
  • Para passar a saída para outro comando, use |.
  • Para tratar erros separadamente, use 2>.

Antes de começar: o único ponto de atenção deste artigo é o >. Ele esvazia o arquivo de destino antes de escrever. Se você apontar > para um arquivo com conteúdo, esse conteúdo some.

O que acontece se errar: o conteúdo antigo não vai para a Lixeira. Ele não pode ser recuperado.

Como testar com segurança: pratique em um diretórioUm local que organiza arquivos. É a mesma ideia da "pasta" do Windows ou macOS. novo, como ~/practice, e escreva em um nome de arquivo novo. Se você só quer acrescentar linhas, use >> desde o início e nada é apagado. O terminalUm programa interativo que interpreta os comandos digitados e os executa. virtual deste site é para aprender, então o seu computador não quebra. Pode testar sem medo.

1. De Onde Vem e Para Onde Vai o Dado?

Conclusão: Um comando Linux tem três canais: stdin, stdout e stderr.

Lina: Senpai, quando eu rodo ls, os nomes dos arquivos aparecem na tela. De onde exatamente eles estão vindo?
Veterano Linny: Ótima pergunta. Todo comando Linux tem três "canais": entrada, saída e erro.
Veterano Linny: Entrada (entrada padrão / stdin) --> comando --> saída (stdout) + erro (stderr).
Lina: Então entrada e saída são canais separados?
Veterano Linny: Certo. E aqui está a ideia principal: esses canais podem ser redirecionados. Você pode enviar o que normalmente vai para a tela para um arquivo, ou passá-lo para outro comando. Esse é o tema de hoje.

Sobre as palavras: entrada padrão, saída padrão e saída de erro padrão costumam ser escritas como stdin, stdout e stderr. As duas formas significam a mesma coisa, e os textos misturam as duas o tempo todo.

Os 3 fluxos padrão

Nome Abreviação Número Destino padrão
Entrada padrão stdin 0 Teclado
Saída padrão stdout 1 Tela
Erro padrão stderr 2 Tela

2. Redirecionamento: Salvar Saída em um Arquivo

Conclusão: Use > para sobrescrever um arquivo e >> para adicionar com segurança.

2-1. > -- Sobrescrever

$ ls > files.txt
Lina: Nada apareceu na tela... falhou?
Veterano Linny: Funcionou. > redirecionou a saída para um arquivo em vez da tela, então nada aparece. Verifique o arquivo.
Veterano Linny: O comando que mostra um arquivo é o cat. Ele exibe na tela o conteúdo do arquivo.
$ cat files.txt
Documents
Downloads
files.txt
Pictures

2-2. >> -- Adicionar

$ echo "line 1" > log.txt
$ echo "line 2" >> log.txt
$ cat log.txt
line 1
line 2

> trunca o arquivo existente antes de escrever. Usar > em um arquivo importante apagará seu conteúdo. Sempre use >> quando quiser adicionar.

Diagrama comparando o que acontece com um arquivo que contém A: cmd > file substitui A por B, enquanto cmd >> file mantém A e acrescenta B abaixo

Figura 1: a caixa da esquerda é o arquivo antes da escrita, a da direita é o mesmo arquivo depois. As duas linhas são casos separados. Com >, o A original desaparece e só resta B. Com >>, B é acrescentado depois de A.

2-3. < -- Ler Entrada de um Arquivo (avançado)

O comando wc conta coisas. Com o -l ele conta linhas.

$ wc -l < log.txt
2
Lina: Qual a diferença disso para wc -l log.txt?
Veterano Linny: O resultado é quase o mesmo, mas o nome do arquivo não é passado como argumento ao comando. < é "fornecer este arquivo no lugar do teclado." Por enquanto, dominar > e >> é suficiente.

3. Pipe: Conectar Comandos

Conclusão: | envia a saída de um comando como entrada para o próximo comando.

3-1. O Básico

| (barra vertical, "pipe") significa "enviar a saída do comando da esquerda como entrada do comando da direita."

$ ls | wc -l
12
Lina: Então a saída de ls é enviada para wc -l para contar arquivos!
Veterano Linny: Exatamente. Esse é o poder dos pipes. Você não precisa de um comando gigante -- você encadeia pequenos comandos especializados para alcançar seu objetivo. Esse é o jeito Linux.

Diagrama de fluxo: a stdout de cmd1 passa pelo símbolo de pipe e vira a stdin de cmd2

Figura 2: | entrega a saída (stdout) do comando da esquerda para a entrada (stdin) do comando da direita. Nada aparece na tela nesse meio do caminhoUma sequência de texto que descreve a localização de um arquivo ou diretório. — os dados seguem direto para o próximo comando. Os erros (stderr) não passam por esse cano; eles continuam indo para a tela.

3-2. Combinações Comuns

# Filtrar lista de arquivos para apenas os que contem ".txt"
$ ls | grep .txt

# Mostrar processos relacionados ao nginx
$ ps aux | grep nginx

# Ordenar o log de acesso em ordem reversa e mostrar as 10 linhas mais recentes
$ cat access.log | sort -r | head -n 10

Pipes podem encadear quantos comandos você quiser

$ cmd1 | cmd2 | cmd3 | ...

O truque é dar a cada estágio um papel claro: filtrar, ordenar, formatar.

4. Pipe vs Redirecionamento

Conclusão: > salva a saída em um arquivo; | passa para um comando.

Lina: Ambos parecem enviar a saída para algum lugar. Qual a diferença entre > e |?
Veterano Linny: O destino é diferente. Aqui está um diagrama.

> vs |

cmd > file    -->  destino e um [arquivo]
cmd | cmd2    -->  destino e [stdin do proximo comando]
  • >: quando você quer salvar
  • |: quando você quer processar mais
# Padrao A: salvar saida de ls em um arquivo
$ ls > list.txt

# Padrao B: filtrar saida de ls atraves do grep
$ ls | grep ".log"

# Padrao C: combinar -- filtrar, depois salvar
$ ls | grep ".log" > log-files.txt

"Encadear com |, depois salvar o resultado com >" é o padrão mais comum no mundo real.

5. Lidando com Erro Padrão (stderr)

Conclusão: Erros usam stderr; separe com 2>, combine com 2>&1.

5-1. Erros Vêm de um Canal Diferente

$ ls /not-exist > out.txt
ls: cannot access '/not-exist': No such file or directory
Lina: Espera, eu enviei tudo para out.txt, mas o erro ainda aparece na tela!
Veterano Linny: Isso é porque erros fluem pelo stderr, e > só redireciona stdout. Para capturar erros, use o número 2.
Lina: Ah, é isso! São duas saídas, e o > pega só uma delas. Então é só usar 2> quando eu quiser os erros, certo?

5-2. Enviar Erros para um Arquivo Separado

$ ls /not-exist 2> error.log
(nada na tela)
$ cat error.log
ls: cannot access '/not-exist': No such file or directory

5-3. Combinar stdout e stderr em Um Único Arquivo

$ command > all.log 2>&1

O que 2>&1 significa

"Enviar stderr (2) para o mesmo lugar que stdout (1)." Esse padrão está em todo lugar na coleta de logs -- memorize a forma.

A ordem importa. > all.log 2>&1 está correto; 2>&1 > all.log não captura stderr em all.log (stderr vai para onde stdout estava apontando antes do redirecionamento).

6. Armadilhas Comuns para Iniciantes

Conclusão: Nunca redirecione um arquivo para ele mesmo; use tee no meio do pipe.

6-1. Usar > Apagou Meu Arquivo

$ cat important.txt > important.txt   # RUIM: arquivo fica vazio

> trunca o arquivo de destino antes que o comando execute. Então cat lê um arquivo já vazio. Nunca redirecione a saída de um comando de volta para o mesmo arquivo que ele lê.

6-2. Preciso de Espaços ao Redor de |?

Ambos funcionam. Adicionar espaços é a convenção para legibilidade.

$ ls|grep txt       # funciona, mas dificil de ler
$ ls | grep txt     # recomendado

6-3. Quero Ver a Saída Intermediária do Pipe

$ ls | tee list.txt | wc -l

tee grava o que está fluindo em um arquivo enquanto passa adiante. Útil para depuração ou para manter um snapshot dos resultados intermediários.

7. Mini Exercícios

Conclusão: Três exercícios: salvar, contar e filtrar-e-salvar saída.

Lina: Entendi a teoria! Quero tentar de verdade.
Veterano Linny: Aqui estão três exercícios. Tente-os no seu terminal.

Exercício 1: Salve a lista de arquivos do seu diretório home em home-files.txt.

Ver a dica 1 (direção)

Você já conhece o comando que lista as coisas. Mude para onde vai o resultado dele: da tela para um arquivo.

Ver a dica 2 (nome dos comandos)

O comando é o ls. O símbolo que muda o destino é o >. O diretório home se escreve ~.

Ver a resposta
$ ls ~ > home-files.txt
$ cat home-files.txt
Documents
Downloads
Pictures
home-files.txt

O > cria o arquivo antes de o comando rodar, então o próprio home-files.txt aparece na lista. O conteúdo varia na sua máquina.

Exercício 2: Conte quantas entradas existem em /etc e imprima a contagem na tela (use um pipe).

Ver a dica 1 (direção)

Envie o resultado do comando de listagem para um comando que conta linhas. Não salve em arquivo.

Ver a dica 2 (nome dos comandos)

Os comandos são ls e wc. A opção que conta linhas é a -l, e o símbolo que une os dois é o |.

Ver a resposta
$ ls /etc | wc -l
220

O número varia na sua máquina. Se aparecer um único número na tela, deu certo.

Exercício 3: De /etc, extraia apenas arquivos terminando em .conf e salve-os em conf-list.txt.

Ver a dica 1 (direção)

Liste as entradas, guarde só as linhas que combinam com um padrão e depois salve o resultado num arquivo. São três etapas.

Ver a dica 2 (nome dos comandos)

Os comandos são ls e grep. Una com | e salve com >. "Termina em .conf" se escreve "\.conf$".

Ver a resposta
$ ls /etc | grep "\.conf$" > conf-list.txt
$ cat conf-list.txt
adduser.conf
ca-certificates.conf
debconf.conf
nsswitch.conf
resolv.conf

O $ em grep "\.conf$" é uma âncora regex que significa "fim da linha", então só sobrevivem os nomes que terminam em .conf. Os nomes listados variam na sua máquina.

8. Revisão

Conclusão: destino arquivo é >; destino próximo comando é |. Os erros saem por uma porta própria.

Lina: Então > quando eu quero salvar, e | quando eu quero entregar ao próximo comando.
Veterano Linny: Exatamente. O > manda para um arquivo, o | manda para o próximo comando. Guarde isso e você não se perde.
Lina: E o erro ficou na tela porque os erros saem por outra porta.
Veterano Linny: Isso. Quando você também quer gravar os erros, escreva > nomedoarquivo 2>&1.

9. Resumo de Hoje em 3 Linhas

Conclusão: redirecionamento, pipes e saída de erro em três linhas.

  1. > sobrescreve e >> acrescenta. Use >> quando o conteúdo precisa sobreviver.
  2. | entrega o resultado do comando da esquerda ao comando da direita.
  3. Os erros saem pela porta número 2. Separe com 2> e junte com 2>&1.

10. Templates para Copiar e Colar

Conclusão: Mantenha formas prontas: salvar, adicionar, filtrar e capturar logs.

Padrões para ter à mão

# Salvar saida em um arquivo (sobrescrever)
command > out.txt

# Adicionar saida a um arquivo
command >> out.txt

# Filtrar saida
command | grep keyword

# Ordenar e pegar as 10 primeiras linhas
command | sort | head -n 10

# Capturar stdout e stderr em um arquivo
command > all.log 2>&1

# Capturar apenas erros
command 2> error.log

# Salvar saida intermediaria E manter o pipe fluindo
command | tee progress.txt | next-command

Resumo: O Que Ler em Seguida

Continue Sua Jornada LPIC-1

Hub LPIC-1

  • Hub de Aprendizado LPIC-1 -- Mapa completo de artigos LPIC-1, acompanhamento de progresso e cobertura dos objetivos do exame

Artigos LPIC-1 Relacionados

Prática