Estou trabalhando em um script bash e, como estou indo, aprendi sobre armadilhas, sinais, códigos de retorno de função e outros recursos que eu não usei anteriormente.
Eu posso estar pensando em coisas incorretas - estou procurando alguns conselhos.
Estou configurando as seguintes opções:
set -o errexit
set -o nounset
set -o noclobber
Eu tenho a seguinte saída e err armadilhas no meu script bash:
# Error handler. This function is called anytime an ERR signal is received.
# This function should never be explictly called.
function _trap_error () {
if [ ! -v _VERBOSE ]; then
echo "An error has occurred. Exiting."
else
_name="$0" # name of the script
_lastline="$1" # argument 1: last line of error occurence
_lasterr="$2" # argument 2: error code of last command
echo "${_name}: line ${_lastline}: exit status of last command: ${_lasterr}"
exit 1
fi
}
trap '_trap_error ${LINENO} ${$?}' ERR
# Exit handler. This function is called anytime an EXIT signal is received.
# This function should never be explicitly called.
function _trap_exit () {
[ -v _POPD ] && popd &> /dev/null
}
trap _trap_exit EXIT
Eles trabalham muito como eu esperava. Em vez de inserir a verificação de erros em todas as minhas funções, estou tentando aproveitar as armadilhas para lidar com isso para mim, por exemplo, ao verificar a existência de um arquivo. Se o módulo especificado não puder ser carregado, eu gostaria de pegá-lo como um erro, exibir uma mensagem de erro e sair.
function _module_path () {
echo "mod.d/$2s/$1/__init__.sh"
}
function _module_exists () {
[ -f $(_module_path $1 $2) ] && return 0 || return 1
}
function _module_push () {
_module_exists $1 $2 && _MODULES+=$( _module_path $1 $2 ) || msg "Module $1 does not exist."
}
No entanto, definir o código de retorno como 0 em conjunto com errexit aciona um sinal EXIT, que é capturado pela minha saída trap. Comecei a tentar descobrir se posso emitir manualmente um sinal de ERR, mas não encontrei uma resposta e comecei a me perguntar se estou fazendo isso corretamente.
Tags error-handling bash exit trap