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
}