Error Handling in bash

I have never really liked error handling in bash but a few weeks back i came across the ability to use traps. this is an awesome feature and i don’t know why i have never come across it before. So the information i generally want when there is an error is:
* Error code.
* Line number of the error.
* and the command that failed.

The error code is simple we all know $? has the error of the last run command. The line number also pretty easy a quick search of the man page presents us with LINENO. the command of the failed is a bit tricky. we have BASH_COMMAND however this doesn’t give us what we want. consider the following script

trap 'echo ${BASH_COMMAND}' err
ls -l ${TMP}

as /bla dose not exit ls will error, the trap will be sprung and the script will print out

ls -l ${TMP}

unfortunately the TMP variable has not been resolved. this is a bit annoying if the offending line is a loop. to fix this a got a bit of help from a colleague and we get something that looks pretty ugly but works

trap 'echo $(eval echo ${BASH_COMMAND})' err
ls -l ${TMP}

So my finale header looks like this

set -e
trap 'echo "ERROR ($?) line ${LINENO}: $(eval echo ${BASH_COMMAND})' err

0 Responses to “Error Handling in bash”

  1. Leave a Comment

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: