Scripts que rodam em cron, CI ou servidores precisam falhar de forma previsível e não continuar em silêncio quando algo dá errado. Este tópico fecha a lacuna entre pipelines simples e scripts de produção.
Todo comando termina com um código (0 = sucesso, ≠ 0 = falha). O script herda o código do último comando executado.
grep ERRO arquivo.log
echo $? # 0 se achou, 1 se não achou (grep), 2 se arquivo inválidoEm scripts:
if ! grep -q ERRO "$log"; then
echo "Nenhum erro encontrado" >&2
exit 1
fiPor padrão, o Bash continua mesmo se um comando falhar. Com set -e (ou set -o errexit), o script encerra na primeira falha:
#!/usr/bin/env bash
set -e
rm /caminho/inexistente # script para aqui
echo "não executa"Exceções comuns: comandos em if, ||, && e alguns pipelines não disparam set -e da mesma forma — teste o seu caso.
set -u
echo "$variavel_que_nao_existe" # erro e exit com set -e também ativoEvita typos em nomes de variáveis ($nme em vez de $nome).
Sem pipefail, o exit code de cmd1 | cmd2 é só o de cmd2:
# Sem pipefail: grep falha, wc "sucesso" → exit 0 enganoso
grep ERRO /nao/existe | wc -l
echo $?Com pipefail:
set -o pipefail
grep ERRO /nao/existe | wc -l
echo $? # reflete falha do grep#!/usr/bin/env bash
set -euo pipefailUse no topo de scripts novos (integradora, deploy, backup). Em scripts legados, ative por partes e teste — pode expor bugs antes mascarados.
- Scripts que tratam falha manualmente (
if cmd; then ...) em todo lugar. - Comandos onde falha é esperada (
grepsem match) — useif grep ... || trueougrep ... && ...com cuidado. - Trechos interativos onde o usuário pode cancelar.
- Pipelines: pipe/pipe.md (menção a
pipefail). - stderr e logs: redirecionamento.md.
- Limpeza ao sair com erro: trap/trap.md.
- Exercícios: fluxos/exercicios.md, PLANO-EXERCICIOS.md.
variaveis-ambiente.md — export, configuração e ambiente em scripts.