====== Traceback shell ====== Exemple : {\rtf1\ansi\deff0{\fonttbl\f0\fmodern Courier New;}\f0\fs20{\colortbl ;\red0\green0\blue0;\red255\green85\blue85;\red255\green255\blue85;\red187\green187\blue187;\red255\green255\blue255;\red0\green0\blue0;}\cf0 \highlight0 root:~# ./traceback.sh gigix.sh\cf1 \highlight1 \par \cf0 \highlight0 ok\cf1 \highlight1 \par \cf0 \highlight0 id\'a0: option invalide -- 'x'\cf1 \highlight1 \par \cf0 \highlight0 Saisissez \'ab\'a0id --help\'a0\'bb pour plus d'informations.\cf1 \highlight1 \par \par \cf0 \highlight0 >>> Traceback (last called is first) :\cf1 \highlight1 \par \cf0 \highlight0 ==> \cf3 id -x\cf0 \b retun \cf2 \b0 1\cf1 \highlight1 \par \cf0 \highlight0 source() in 2.sh:3\cf1 \highlight1 \par \cf0 \highlight0 source() in gigix.sh:5\cf1 \highlight1 \par \cf0 \highlight0 main() in ./traceback.sh:40\cf1 \highlight1 \par } #!/bin/bash #set -o pipefail # trace ERR through pipes #set -o nounset ## set -u : exit the script if you try to use an uninitialised variable set -o errexit ## set -e : exit the script if any statement returns a non-true return value set -o errtrace # trace ERR through 'time command' and other functions traceback() { local -i start=1 local -i end=${#BASH_SOURCE[@]} local -i i=0 local -i j=0 local cmd="$1" local -i code="$2" echo -e "\n >>> Traceback (last called is first) :" 1>&2 echo -e " ==> \e[93m${cmd}\033[0m \e[1mretun \e[91m${code}\033[0m" for ((i=${start}; i < ${end}; i++)); do j=$(( $i - 1 )) local function="${FUNCNAME[$i]}" local file="${BASH_SOURCE[$i]}" local line="${BASH_LINENO[$j]}" echo " ${function}() in ${file}:${line}" 1>&2 done } usage() { echo "Usage :" echo " `basename $0` " exit 1 } #trap 'exit_handler "$?" "$LINENO" "${BASH_LINENO[*]}" "${BASH_SOURCE[*]}" "$BASH_COMMAND" "${FUNCNAME[*]:-empty}"' ERR trap 'traceback "$BASH_COMMAND" "$?"' ERR [ -f "$1" ] || usage . $1