Pipes e Redirecionamento: Entendendo o Fluxo de Dados no Linux
O Que Voce Vai Aprender
- O conceito de "fluxo de dados" no Linux
- A diferenca entre
|(pipe) e>>>(redirecionamento) - Como lidar com stdout e stderr separadamente
- Como combinar
grep,sorte outras ferramentas encadeando pequenos comandos
Resumo Rapido
- Quer salvar a saida em um arquivo -->
>>> - Quer passar a saida para outro comando -->
| - Quer tratar erros separadamente -->
2>
1. De Onde Vem e Para Onde Vai o Dado?
Conclusao: Um comando Linux tem tres canais: stdin, stdout e stderr.
ls, os nomes dos arquivos aparecem na tela. De onde exatamente eles estao vindo?Os 3 fluxos padrao
| Nome | Abreviacao | Numero | Destino padrao |
|---|---|---|---|
| Entrada padrao | stdin | 0 |
Teclado |
| Saida padrao | stdout | 1 |
Tela |
| Erro padrao | stderr | 2 |
Tela |
2. Redirecionamento: Salvar Saida em um Arquivo
Conclusao: Use
>para sobrescrever um arquivo e>>para adicionar com seguranca.
2-1. > -- Sobrescrever
$ ls > files.txt
> redirecionou a saida para um arquivo em vez da tela, entao nada aparece. Verifique o 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 apagara seu conteudo. Sempre use >> quando quiser adicionar.
2-3. < -- Ler Entrada de um Arquivo (avancado)
$ wc -l < log.txt
2
wc -l log.txt?< e "fornecer este arquivo no lugar do teclado." Por enquanto, dominar > e >> e suficiente.3. Pipe: Conectar Comandos
Conclusao:
|envia a saida de um comando como entrada para o proximo comando.
3-1. O Basico
| (barra vertical, "pipe") significa "enviar a saida do comando da esquerda como entrada do comando da direita."
$ ls | wc -l
12
ls e enviada para wc -l para contar arquivos!3-2. Combinacoes 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 voce quiser
$ cmd1 | cmd2 | cmd3 | ...
O truque e dar a cada estagio um papel claro: filtrar, ordenar, formatar.
4. Pipe vs Redirecionamento
Conclusao:
>salva a saida em um arquivo;|passa para um comando.
> e |?> vs |
cmd > file --> destino e um [arquivo] cmd | cmd2 --> destino e [stdin do proximo comando]
>: quando voce quer salvar|: quando voce 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 >" e o padrao mais comum no mundo real.
5. Lidando com Erro Padrao (stderr)
Conclusao: Erros usam stderr; separe com
2>, combine com2>&1.
5-1. Erros Vem 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!> so redireciona stdout. Para capturar erros, use o numero 2.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 Unico Arquivo
$ command > all.log 2>&1
O que 2>&1 significa
"Enviar stderr (2) para o mesmo lugar que stdout (1)." Esse padrao esta em todo lugar na coleta de logs -- memorize a forma.
A ordem importa. > all.log 2>&1 esta correto; 2>&1 > all.log nao captura stderr em all.log (stderr vai para onde stdout estava apontando antes do redirecionamento).
6. Armadilhas Comuns para Iniciantes
Conclusao: 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. Entao cat le um arquivo ja vazio.
Nunca redirecione a saida de um comando de volta para o mesmo arquivo que ele le.
6-2. Preciso de Espacos ao Redor de |?
Ambos funcionam. Adicionar espacos e a convencao para legibilidade.
$ ls|grep txt # funciona, mas dificil de ler $ ls | grep txt # recomendado
6-3. Quero Ver a Saida Intermediaria do Pipe
$ ls | tee list.txt | wc -l
tee grava o que esta fluindo em um arquivo enquanto passa adiante. Util para depuracao ou para manter um snapshot dos resultados intermediarios.
7. Mini Exercicios
Conclusao: Tres exercicios: salvar, contar e filtrar-e-salvar saida.
Exercicio 1: Salve a lista de arquivos do seu diretorio home em home-files.txt.
Mostrar dica
Use > para redirecionar a saida para um arquivo.
Mostrar resposta
$ ls ~ > home-files.txt
Exercicio 2: Conte quantas entradas existem em /etc e imprima a contagem na tela (use um pipe).
Mostrar dica
Passe a saida de ls para wc -l.
Mostrar resposta
$ ls /etc | wc -l
Exercicio 3: De /etc, extraia apenas arquivos terminando em .conf e salve-os em conf-list.txt.
Mostrar dica
Combine ls --> grep --> >.
Mostrar resposta
$ ls /etc | grep "\.conf$" > conf-list.txt
O $ em grep "\.conf$" e uma ancora regex que significa "fim da linha", entao apenas nomes de arquivo terminando com .conf sobrevivem.
8. Templates para Copiar e Colar
Conclusao: Mantenha formas prontas: salvar, adicionar, filtrar e capturar logs.
Padroes para ter a mao
# 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