#!/usr/bin/env bash ## No bash script should be considered releasable until it has this! ## origin: https://gist.github.com/RichardBronosky/5222338 ## usage (vim): :0r !curl -sL http://j.mp/safebash set -o errexit # stop the script each time a command fails set -o nounset # stop if you attempt to use an undef variable function bash_traceback() { local lasterr="$?" set +o xtrace local code="-1" local bash_command=${BASH_COMMAND} echo "Error in ${BASH_SOURCE[1]}:${BASH_LINENO[0]} ('$bash_command' exited with status $lasterr)" if [ ${#FUNCNAME[@]} -gt 2 ]; then # Print out the stack trace described by $function_stack echo "Traceback of ${BASH_SOURCE[1]} (most recent call last):" for ((i=0; i < ${#FUNCNAME[@]} - 1; i++)); do local funcname="${FUNCNAME[$i]}" [ "$i" -eq "0" ] && funcname=$bash_command echo -e " $i: ${BASH_SOURCE[$i+1]}:${BASH_LINENO[$i]}\t$funcname" done fi echo "Exiting with status ${code}" exit "${code}" } # provide an error handler whenever a command exits nonzero trap 'bash_traceback' ERR # propagate ERR trap handler functions, expansions and subshells set -o errtrace