Tutorial de Linux / Entrada, saída, redirecionamentos e pipes no Bash
No Bash, use < para fornecer um arquivo como entrada padrão, > ou >> para salvar a saída padrão e 2> para salvar a saída de erro padrão. Um pipe | conecta a saída padrão de um comando à entrada padrão do seguinte. Acompanhar esses caminhos permite entender por que um resultado vai para um arquivo enquanto uma mensagem continua aparecendo no terminal.
Esta prática acompanha os dados entre comandos e arquivos. As condições de sucesso e falha usadas por && e || são tratadas na aula de estado de saída e execução condicional no shell, em inglês. Aqui, o foco é o destino de cada fluxo.
Distinguir os três fluxos padrão
Um processo normalmente recebe três canais identificados por descritores de arquivo: números que permitem ao programa acessar esses canais. A entrada costuma vir do terminal e as duas saídas costumam aparecer nele; redirecionamentos e pipes podem mudar essas conexões. Os nomes em inglês aparecem com frequência nas mensagens e na documentação:
| Número | Fluxo | Função principal |
|---|---|---|
0 |
Entrada padrão (stdin, standard input) | Dados que o comando lê |
1 |
Saída padrão (stdout, standard output) | Resultados normais do comando |
2 |
Erro padrão (stderr, standard error) | Mensagens de diagnóstico e erro |
Ver uma mensagem no terminal não revela, por si só, qual saída a produziu. >, sem número, redireciona o descritor 1; o descritor 2 pode continuar ligado à tela. Em 2>, o número deve ficar junto do operador: separar 2 com um espaço muda a interpretação da linha.
Criar um arquivo para a prática
Use Bash e um diretório no qual seu usuário comum possa gravar. Se ~/linux-course-14-practice já existir, escolha outro nome e substitua-o nas duas primeiras linhas. Execute uma linha por vez e pare se mkdir ou cd falhar: os redirecionamentos seguintes podem substituir arquivos no diretório errado.
mkdir ~/linux-course-14-practice
cd ~/linux-course-14-practice
pwd
Confirme que pwd mostra o diretório novo e que os nomes usados abaixo ainda não existem. O sucesso de pwd, sozinho, não prova que cd funcionou. Primeiro grave duas linhas; depois acrescente a terceira e leia o arquivo:
printf 'alpha\nbeta\n' > source.txt
printf 'gamma\n' >> source.txt
cat source.txt
O resultado deve mostrar alpha, beta e gamma, uma linha por palavra, nessa ordem. Cada \n no formato de printf produz uma nova linha. > cria o arquivo se ele não existir e, no comportamento normal do Bash, esvazia um arquivo existente antes de gravar. Já >> cria o arquivo ou acrescenta ao final, preservando o conteúdo anterior. Repetir a linha com >> acrescenta outro gamma; repetir o bloco completo restaura as três linhas, pois a primeira linha começa substituindo o conteúdo.
Fornecer entrada e salvar a saída normal
< abre um arquivo para leitura e o conecta à entrada padrão. Assim, wc recebe os dados pelo descritor 0, sem receber o nome do arquivo como argumento:
wc -l < source.txt
A saída deve conter o número 3, sem o nome do arquivo. Em contraste, wc -l source.txt normalmente mostra a contagem seguida de source.txt. O -l conta caracteres de nova linha; o arquivo desta prática termina cada uma das três linhas com um deles.
Para guardar o resultado normal de uma busca, use >. A primeira linha abaixo grava a linha que contém beta em matches.txt; a segunda lê esse arquivo e mostra seu conteúdo no terminal:
grep 'beta' source.txt > matches.txt
cat matches.txt
Confirme a saída beta. A busca não imprime sua saída padrão na tela porque ela foi redirecionada; quem a mostra depois é cat. Se houver um erro na busca, ele ainda pode aparecer no terminal. Para rever os comandos de seleção e contagem, consulte a aula de grep, sort, uniq, cut e wc.
O shell abre o destino do redirecionamento antes de executar o comando. Portanto, um comando que falha ainda pode deixar um arquivo vazio, e tentar ler e gravar o mesmo arquivo com cat source.txt > source.txt pode apagar o conteúdo antes da leitura. Para preservar dados, use um destino diferente e confira o resultado antes de qualquer substituição. A opção noclobber do Bash pode bloquear > sobre um arquivo regular existente, mas não substitui a conferência do caminho nem recupera conteúdo já perdido.
Separar ou reunir as mensagens de erro
Na pasta nova, mantenha absent-14.txt inexistente. Ao tentar consultá-lo, ls envia um diagnóstico para o erro padrão e termina com estado diferente de zero. O redirecionamento 2> guarda esse diagnóstico, sem redirecionar a saída padrão:
ls absent-14.txt 2> errors.txt
cat errors.txt
A primeira linha não deve mostrar o diagnóstico na tela; a segunda deve exibir a mensagem guardada em errors.txt, indicando que o arquivo não existe. A redação depende da implementação e da localidade. O sucesso de cat ao ler a mensagem não significa que ls teve sucesso: cada comando tem seu próprio estado de saída.
Para reunir as duas saídas em um arquivo, use > all.txt 2>&1. Primeiro o shell conecta a saída padrão ao arquivo; depois faz o descritor 2 usar o destino atual do descritor 1. O &1 indica esse descritor, não um arquivo chamado 1:
ls absent-14.txt > all.txt 2>&1
cat all.txt
O diagnóstico deve estar em all.txt. Os redirecionamentos são processados da esquerda para a direita. Inverter para ls absent-14.txt 2>&1 > all.txt conecta primeiro o erro ao destino anterior da saída padrão, normalmente o terminal; só depois a saída padrão passa para o arquivo. Nesse exemplo, o erro continua no destino anterior e all.txt fica vazio. O descritor 2 não acompanha automaticamente as mudanças posteriores do descritor 1.
Conectar comandos com um pipe
O operador | conecta a saída padrão do comando à esquerda à entrada padrão do comando à direita. Neste caso, grep fornece as linhas que contêm beta e wc -l conta as novas linhas recebidas:
grep 'beta' source.txt | wc -l
O resultado esperado é 1. O pipe simples não encaminha também o erro padrão. Se o arquivo de entrada estiver ausente, o diagnóstico de grep pode aparecer no terminal enquanto wc -l imprime 0, pois não recebeu linhas pela entrada padrão. Para incluir o erro no pipe deliberadamente, é preciso redirecioná-lo, por exemplo com 2>&1 antes de |; isso mistura diagnósticos aos dados que o próximo comando processa.
Por padrão, o estado de saída da pipeline no Bash é o do último comando. Uma busca sem correspondências faz grep retornar 1, mas wc -l pode imprimir 0 e retornar sucesso, deixando a pipeline com estado 0. Uma falha de leitura na etapa anterior também pode ficar oculta por esse resultado final. Distingua uma busca válida sem resultados de uma falha ao acessar os dados.
Quando o estado das etapas anteriores importa, verifique cada etapa ou considere a opção pipefail. Com ela, a pipeline retorna o estado do comando mais à direita que terminou com estado diferente de zero; retorna 0 se todos tiverem sucesso. A opção muda a avaliação do estado, não transforma automaticamente a ausência de correspondências em erro de leitura e não garante, sozinha, a interrupção do script. Antes de mudar opções da sessão, avalie os efeitos nos demais comandos.
Se o resultado surpreender, confirme primeiro o diretório e o arquivo de entrada, execute a busca isoladamente e examine separadamente a saída normal e o erro. Depois reconecte o pipe. Para refazer apenas os dados desta prática, execute novamente o bloco de printf e confirme as três linhas com cat; esse procedimento sobrescreve intencionalmente apenas o arquivo de exemplo no diretório que você verificou.
Documentação oficial
O manual de redirecionamentos do GNU Bash descreve os descritores, a abertura de arquivos, <, >, >> e a ordem de aplicação. O manual de pipelines do GNU Bash explica a conexão dos fluxos e a avaliação do estado de saída com e sem pipefail.




