Depuração de scripts BASH

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