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,sorte 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.
ls, os nomes dos arquivos aparecem na tela. De onde exatamente eles estão vindo?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
> redirecionou a saída para um arquivo em vez da tela, então nada aparece. Verifique o arquivo.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.
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
wc -l log.txt?< é "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
ls é enviada para wc -l para contar arquivos!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.
> e |?> 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 com2>&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
out.txt, mas o erro ainda aparece na tela!> só redireciona stdout. Para capturar erros, use o número 2.> 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
teeno 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.
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.
> quando eu quero salvar, e | quando eu quero entregar ao próximo comando.> manda para um arquivo, o | manda para o próximo comando. Guarde isso e você não se perde.> nomedoarquivo 2>&1.9. Resumo de Hoje em 3 Linhas
Conclusão: redirecionamento, pipes e saída de erro em três linhas.
>sobrescreve e>>acrescenta. Use>>quando o conteúdo precisa sobreviver.|entrega o resultado do comando da esquerda ao comando da direita.- Os erros saem pela porta número 2. Separe com
2>e junte com2>&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