Bash:
Tratamento de erros

Como fazer:

#!/bin/bash

# Redirecionando stderr para um arquivo
grep "algo" arquivo.txt 2> erros.log

# Tratamento de erro com status de saída
if ! grep "algo" arquivo.txt; then
    echo "Ops, algo deu errado ao procurar por 'algo'."
    exit 1
fi

# Usando um trap para limpar antes de sair por erro
cleanup() {
  echo "Limpando arquivos temporários..."
  rm temp_*
}

trap cleanup ERR

# erro intencional: arquivo não existe
cat temp_file.txt

Saída de exemplo quando ocorre um erro:

Limpando arquivos temporários...
cat: temp_file.txt: Arquivo ou diretório não encontrado

Aprofundamento

O tratamento de erros em scripts Bash remonta às origens do shell Unix, onde scripts robustos e confiáveis eram (e são) vitais para administração de sistemas e automação. Tradicionalmente, erros em Bash são tratados verificando o status de saída de um comando, que por convenção retorna 0 para sucesso e um valor não zero para falha.

O Bash introduziu o comando trap como um built-in, permitindo que os usuários especifiquem comandos para rodar em vários sinais ou saídas de script. Isso é útil para tarefas de limpeza ou como um mecanismo de tratamento de erros de último recurso.

Há também o comando set, que pode mudar o comportamento do Bash em erros. Por exemplo, set -e fará com que um script saia imediatamente se qualquer comando sair com um status não zero, uma maneira de falhar rapidamente e evitar erros em cascata.

Alternativas ao tratamento de erro interno do Bash incluem a verificação explícita da existência de arquivos, o uso de substituição de comandos ou até mesmo a escrita de suas próprias funções para lidar com erros de forma mais granular.

Embora o tratamento de erros rigoroso possa às vezes parecer exagero para scripts pequenos, é uma prática que pode economizar muito tempo de depuração e prevenir comportamentos inesperados tanto para você quanto para os usuários.

Veja Também

Lembre-se, scripting é uma forma de arte, e como você lida com deslizes e tropeços pode tornar sua obra-prima mais resiliente. Feliz scriptagem!