Redirecionamento de saída
O operador > redireciona stdout para um arquivo, sobrescrevendo o conteúdo. O >> adiciona ao final.
# Sobrescreve o arquivo
echo "Primeira linha" > /tmp/teste.txt
# Adiciona ao final
echo "Segunda linha" >> /tmp/teste.txt
cat /tmp/teste.txt
Primeira linha
Segunda linha
Redirecionamento de erros
O file descriptor 2 representa stderr. Redirecionar erros separadamente é essencial em scripts de produção.
# Redirecionar só erros para um arquivo
find /etc -name "*.conf" 2> /tmp/erros.log
# Redirecionar stderr para stdout (combinar ambos)
find /etc -name "*.conf" 2>&1 | head -5
# Redirecionar tudo com &> (atalho do Bash)
find /etc -name "*.conf" &> /tmp/saida_completa.log
Dica: A ordem importa.
cmd > arquivo 2>&1 redireciona tudo para o arquivo. Já cmd 2>&1 > arquivo redireciona só stdout para o arquivo — stderr vai para o terminal./dev/null — o buraco negro
Descarte saída que não interessa. Muito usado para silenciar comandos em scripts.
# Silenciar toda saída
apt-get update &> /dev/null
# Testar se um comando existe sem mostrar nada
if command -v docker &> /dev/null; then
echo "Docker está instalado"
else
echo "Docker não encontrado"
fi
# Descartar só os erros
grep -r "ERROR" /var/log/ 2> /dev/null | head -3
Pipes
O pipe | conecta a saída de um comando à entrada do próximo. É a base da filosofia Unix.
# Top 5 processos por memória
ps aux --sort=-%mem | head -6
USER PID %CPU %MEM VSZ RSS TTY STAT COMMAND
mysql 1234 2.1 12.3 198432 62456 ? Ssl mysqld
www-data 5678 1.5 8.7 145672 44312 ? S apache2
root 9012 0.8 4.2 98344 21456 ? Ss dockerd
postgres 3456 0.5 3.8 87652 19432 ? Ss postgres
root 7890 0.3 2.1 67832 10784 ? Ss systemd-journal
Pipelines mais elaborados:
# Contar conexões por IP
ss -tn | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -rn | head -5
# Encontrar pacotes instalados que ocupam mais espaço
dpkg-query -W --showformat='${Installed-Size}\t${Package}\n' \
| sort -rn | head -10
tee — ver e salvar ao mesmo tempo
O tee duplica o fluxo: manda para stdout e para um arquivo simultaneamente.
# Salvar e visualizar simultaneamente
df -h | tee /tmp/disco.txt
# Adicionar ao arquivo em vez de sobrescrever
free -h | tee -a /tmp/relatorio.txt
# Usar tee no meio de um pipeline
cat /var/log/syslog | grep "error" | tee /tmp/erros.txt | wc -l
Substituição de processo
A sintaxe <(comando) cria um file descriptor temporário com a saída do comando. Perfeito para comparar saídas.
# Comparar pacotes instalados em dois servidores
diff <(ssh srv1 dpkg -l) <(ssh srv2 dpkg -l)
# Comparar conteúdo de dois diretórios
diff <(ls /etc/nginx/sites-enabled/) <(ls /etc/nginx/sites-available/)
Here documents
Here documents permitem passar blocos de texto como entrada padrão. Essencial para gerar arquivos de configuração em scripts.
# Criar arquivo de configuração
cat << EOF > /tmp/app.conf
[database]
host=localhost
port=5432
name=producao
EOF
# Com <<- para permitir indentação com tab
gerar_vhost() {
local DOMINIO="$1"
cat <<-EOF
server {
listen 80;
server_name ${DOMINIO};
root /var/www/${DOMINIO};
}
EOF
}
gerar_vhost "exemplo.com.br"
server {
listen 80;
server_name exemplo.com.br;
root /var/www/exemplo.com.br;
}
Dica: Use
<< 'EOF' (com aspas) para impedir a expansão de variáveis dentro do here document. Sem aspas, $VAR será substituído pelo seu valor.