====== 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