Ligando comandos: Redirecionadores e Pipes no Bash
Um dos pilares da filosofia Unix é simples e poderoso: faça programas que realizem apenas uma tarefa, façam bem-feita e que consigam trabalhar em conjunto através de texto plano.
No dia a dia do terminal, é muito comum precisarmos capturar o resultado de um comando para salvar em arquivo, alimentar outro processo em memória ou injetar variáveis sem criar scripts complexos.
Para isso, o Bash oferece redirecionadores de fluxo (entrada, saída e erro) e conectores (pipes). Vamos explorar os principais com exemplos práticos.
1. Redirecionador de Saída Padrão — Sobrescrever (>)
O operador > direciona a saída padrão (stdout) de um comando diretamente para um arquivo.
- Se o arquivo não existir, ele é criado.
- Se o arquivo já existir, seu conteúdo anterior é completamente apagado (truncado) e substituído pelo novo.
$ uptime > status.txt
$ cat status.txt
14:30:15 up 14 days, 4:12, 2 users, load average: 0.12, 0.08, 0.05
Se executarmos outro comando apontando para o mesmo arquivo com >, o conteúdo antigo dá lugar ao novo:
$ hostname > status.txt
$ cat status.txt
srv-producao-01
2. Redirecionador de Saída Padrão — Anexar (>>)
Quando você precisa registrar históricos, criar arquivos de log ou manter o que já existia no arquivo, utiliza-se o operador >>.
- Se o arquivo não existir, ele é criado.
- Se o arquivo já existir, o novo conteúdo é anexado ao final (append), preservando as linhas anteriores.
$ echo "Iniciando rotina de backup..." > deploy.log
$ echo "Executado em: $(date '+%Y-%m-%d %H:%M:%S')" >> deploy.log
$ echo "Status: OK" >> deploy.log
$ cat deploy.log
Iniciando rotina de backup...
Executado em: 2026-10-30 21:05:00
Status: OK
3. Conector de Comandos (| — Pipe)
O caractere pipe (|) conecta a saída padrão (stdout) do comando à esquerda diretamente à entrada padrão (stdin) do comando à direita.
Tudo acontece em memória, sem a necessidade de gravar arquivos temporários em disco. É a ferramenta essencial para encadear filtros.
# Descobrir quantos processos do nginx estão em execução:
$ ps aux | grep [n]ginx | wc -l
4
# Listar os 5 maiores diretórios dentro de /var/log:
$ du -sh /var/log/* 2>/dev/null | sort -hr | head -n 5
2.4G /var/log/journal
412M /var/log/syslog
120M /var/log/nginx
45M /var/log/auth.log
12M /var/log/dpkg.log
4. Redirecionamento de Entrada Padrão (<)
Enquanto o > envia dados para um arquivo, o < faz o caminho inverso: alimenta a entrada padrão (stdin) de um comando com o conteúdo de um arquivo.
É indispensável quando o comando não aceita receber nomes de arquivos como argumentos diretamente, ou quando você deseja isolar o processamento do texto.
# O comando wc lendo diretamente o arquivo exibe o nome do arquivo na saída:
$ wc -l ips.txt
42 ips.txt
# Mas usando o redirecionador de entrada <, ele recebe apenas o fluxo de dados:
$ wc -l < ips.txt
42
Dica de Script: A segunda forma é ideal quando você quer armazenar apenas o número em uma variável no Bash, sem precisar usar
cutouawkpara remover o nome do arquivo:TOTAL_IPS=$(wc -l < ips.txt) echo "Total de IPs encontrados: $TOTAL_IPS"
5. Here-String (<<<)
O operador <<< injeta uma string ou o conteúdo de uma variável diretamente na entrada padrão (stdin) do comando.
Ele elimina a necessidade de fazer echo "$variavel" | comando, evitando a criação de um processo extra (subshell) na tabela do sistema operacional.
# Forma tradicional com pipe (cria subprocesso desnecessário):
$ echo "192.168.1.100" | cut -d'.' -f4
100
# Usando Here-String (muito mais rápido e limpo):
$ cut -d'.' -f4 <<< "192.168.1.100"
100
Outro exemplo comum para transformar caracteres com o utilitário tr:
$ PACOTE="kernel-core-6.8.0.rpm"
$ tr '[:lower:]' '[:upper:]' <<< "$PACOTE"
KERNEL-CORE-6.8.0.RPM
6. Here-Document (<<)
O Here-Document (ou heredoc) envia um bloco inteiro de texto com múltiplas linhas para a entrada padrão de um comando, delimitado por um marcador de início e fim (por convenção, utiliza-se EOF, FIM ou TEXTO).
É excelente para gerar arquivos de configuração ou scripts sem precisar de dezenas de comandos echo:
$ cat << 'EOF' > /etc/resolv.conf
# Configuração de DNS gerada automaticamente
nameserver 1.1.1.1
nameserver 8.8.8.8
options timeout:2 attempts:3
EOF
Dica sobre aspas no delimitador:
- Se você usar
<< EOF(sem aspas), o Bash irá interpretar variáveis como$USER,$(hostname)e comandos no meio do texto.- Se você usar
<< 'EOF'(com aspas simples), o Bash não interpretará nada, gravando o texto de forma literal.
Bônus: Redirecionando Saída de Erro (2> e &>)
No terminal, existem três canais fundamentais:
0: Entrada padrão (stdin)1: Saída padrão (stdout)2: Saída de erro padrão (stderr)
Quando um comando gera um erro, o operador > normal não captura a mensagem (pois ele atua apenas no canal 1). Para controlar mensagens de erro:
# 1. Descartar mensagens de erro (enviando para o buraco negro /dev/null):
$ find /etc -name "*.conf" 2> /dev/null
# 2. Salvar saídas normais em um arquivo e erros em outro:
$ ./meu_script.sh > execucao.log 2> erros.log
# 3. Redirecionar tudo (stdout e stderr) para o mesmo arquivo:
$ ./meu_script.sh &> geral.log
Conclusão
Entender a fundo o funcionamento dos redirecionadores e conectores no terminal auxilia enormemente na produtividade diária, reduz a quantidade de linhas de código em scripts e, o mais importante: permite combinar utilitários simples e confiáveis para resolver problemas complexos com elegância.