Simple bash debugger using trap DEBUG
Inspired by this post by @tminnigaliev.
Besides traps(handlers) for signals, bash have 4 special traps:
-
EXIT
to run on exit from the shell. -
RETURN
to run each time a function or a sources script finishes. -
ERR
to run each time command failure would cause the shell to exit ifset -e
is used. -
DEBUG
to execute before every command.
The last one allows to create a simple debugger inside a bash script:
function _trap_DEBUG() {
echo "# $BASH_COMMAND";
while read -r -e -p "debug> " _command; do
if [ -n "$_command" ]; then
eval "$_command";
else
break;
fi;
done
}
trap '_trap_DEBUG' DEBUG
Now before executing every command, it is printed and we have a command prompt. There we can print any command to execute in the script context or an empty line to continue.
Also it is possible to run another script in this debugging mode without modifying it. The only catch is that bash functions and scripts inlined by source
do not inherit DEBUG, RETURN and ERR traps. We can use set -T
to allow inheriting DEBUG and RETURN traps.
Here is such a simple debugger with some bells and whistles added: selivan/bash-debug
Also it is worth mentioning that a gdb-like debugger for bash scripts exists: bashdb. It has way more functionality but requires building from source and installation.