Debug Shell Scripts

In order to debug shell scripts, the following two tricks are useful.

Trace all commands
To print each command as it is executed, use the following command at the start of your script:

set -x

Redirect STDOUT and STDERR
In case the script is called from another process, you can not see it's output (including useful errors to STDERR). In order logfile=/tmp/shellscript.log exec 2> $logfile  # redirect STDERR to $logfile exec 1>&2         # redirect STDOUT to STDERR, so it also ends up in $logfile

Combined Result
In case you want to do things very proper, you should also restore the STDOUT and STDERR file descriptors.

logfile=/tmp/logfile.txt exec 5>&1      # Save STDOUT (#1) descriptor in #5 exec 6>&2      # Save STDERR (#2) descriptor in #6 exec 2> $logile # Redirect STDERR to logfile exec 1>&2      # Redirect STDOUT to STDERR set -x         # turn trace on set +x          # turn trace off exec 1>&5      # Restore STDOUT exec 2>&6      # Restore STDERR exit 0
 * 1) !/bin/sh
 * 1) ... your script goes here ...