#!/bin/bash -e # template for bash scripts # internal use only append_msg() { if test $# -ne 0; then echo -en ":\e[0m \e[1m$*" fi echo -e "\e[0m" } # write a notice notice() { if test $# -eq 0; then return fi echo -e "\e[1m$*\e[0m" 1>&3 } # write error message error() { echo -en "\e[1;31merror" 1>&2 append_msg $* 1>&2 } # write a warning message warning() { echo -en "\e[1;33mwarning" 1>&2 append_msg $* 1>&2 } # write a success message success() { echo -en "\e[1;32msuccess" 1>&2 append_msg $* 1>&2 } # commandline parameter evaluation while test $# -gt 0; do case "$1" in (--help|-h) less < running:\e[0m $* ..." result=$($* 2>&1) res=$? if test $res -ne 0; then if test $check -eq 1; then error "failed with return code: $res" if test -n "$result"; then echo "$result" fi exit 1 else warning "ignored return code: $res" fi else success fi } # error handler function traperror() { set +x local err=($1) # error status local line="$2" # LINENO local linecallfunc="$3" local command="$4" local funcstack="$5" for e in ${err[@]}; do if test -n "$e" -a "$e" != "0"; then error "line $line - command '$command' exited with status: $e (${err[@]})" if [ "${funcstack}" != "main" -o "$linecallfunc" != "0" ]; then echo -n " ... error at ${funcstack} " if [ "$linecallfunc" != "" ]; then echo -n "called at line $linecallfunc" fi echo fi exit $e fi done success exit 0 } # catch errors trap 'traperror "$? ${PIPESTATUS[@]}" $LINENO $BASH_LINENO "$BASH_COMMAND" "${FUNCNAME[@]}" "${FUNCTION}"' ERR SIGINT INT TERM EXIT ##########################################################################################