Print the stack trace in bash

Ieri ho partorito una semplice funzione che trovo molto comoda per debuggare gli scritp shell, si chiama print_stack_trace.

print_stack_trace andrebbe invocata quando si incontra una condizione di errore e si vuole risalire a qual’e’ stato il flusso delle chiamate che l’ha provocata.

Un esempio di utilizzo è il seguente::

save_to_file() {
    local filename="$1"

    if [[ -e $filename ]]; then
        echo "File already exists: $filename" >2
        print_stack_trace
        exit 1
    fi

    ... # scrittura su file
}

Quando per qualsiasi motivo la funzione save_to_file() è invocata con un argomento non valido stampa un messaggio di errore seguito dall’elenco delle chiamate a funzione che hanno portato all’errore. Per esempio:

File already exists: test-file
Stack trace:
 save_to_file(./print-stack-trace.bash:13)
 function_three(./print-stack-trace.bash:22)
 function_two(./print-stack-trace.bash:26)
 function_one(./print-stack-trace.bash:30)
 main(./print-stack-trace.bash:33)

La funzione print_stack_trace è la seguente:

# print_stack_trace: print the stack trace in bash
print_stack_trace() {
    echo "Stack trace:"
    for (( i=1; i<${#FUNCNAME[@]}; i++)); do
        echo " ${FUNCNAME[$i]}(${BASH_SOURCE[$i]}:${BASH_LINENO[$i-1]})"
    done
}