Aqui está uma dica (ou duas) que você pode usar para depurar um script bash como faria em uma linguagem mais estruturada.
Manipulação de erros
#!/bin/bash
LOGFILE=/tmp/err.log
function catcherr() {
rval=$?
line=$1
echo "$(date): Died with return value [$rval] at line number [$line]" >>$LOGFILE >/dev/stderr
}
trap 'catcherr $LINENO' ERR
false
echo "done"
Simplesmente : trap configura uma condição que chama catcherr quando um valor de retorno diferente de zero ocorre durante seu script.
Linha por linha : definimos primeiro o arquivo de log. Normalmente executo a maioria dos meus scripts sem controle por meio de um agendador, portanto, um arquivo de log é mais útil do que STDOUT ou STDERR.
LOGFILE=/tmp/err.log
Para lidar com os erros de script, você precisa ter algum código para executar quando o erro é lançado. A maneira mais limpa de fazer isso é com uma função simples.
function catcherr() {
rval=$?
line=$1
echo "$(date): Died with return value [$rval] at line number [$line]" >>$LOGFILE >/dev/stderr
}
A função primeiro captura o valor de retorno do último comando executado ($?). Esta deve ser a primeira linha na função, pois é sobrescrita com cada linha executada. $ 1 é o primeiro argumento da função.
A instrução echo é a “carne” do tratamento de erros. Ele anexa a mensagem a $ LOGFILE, cospe-a em STDERR apenas no caso e registra o valor de retorno e o número da linha com o carimbo de data / hora. Você também pode personalizar seu carimbo de data / hora na função $ (data); verifique a data –help. Você pode querer uma ‘saída’ no final desta função, sem ela o bash continuará a execução após o erro.
A chamada de trap é o que liga o código a ser executado (o primeiro argumento) e o evento de acionamento. O primeiro argumento é avaliado no momento do evento , portanto, o argumento para a função catcherr é a variável de ambiente interna do bash $ LINENO, que será a linha sendo executada quando o gatilho ERR for atingido.
trap 'catcherr $LINENO' ERR
O gatilho ERR é disparado quando um valor de retorno diferente de zero ocorre em uma linha em seu script. Isso pode ser devido a um comando ausente ou apenas erros inesperados. Algumas funções retornarão valores diferentes de zero intencionalmente, como grep. Você precisará certificar-se de executá-los em blocos condicionais se não quiser acionar essa armadilha.
Para obter mais informações sobre o trap (incluindo os diferentes gatilhos, como DEBUG), verifique a entrada do manual: http://www.gnu.org/software/bash/manual/bashref.html#index-trap
Para obter mais informações sobre as variáveis de ambiente interno do bash (particularmente FUNCNAME), verifique a entrada do manual: http://www.gnu.org/software/bash/manual/bashref.html#Bash-Variables