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.