X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=switch-mail-host;h=e52abdb45326c9617697e591e7f5d9b3e62d1a9e;hb=41b0266eb94d37f2264256897956ba4c1c6a04d6;hp=bac21484c89dc93ec67969c330a44377eecc9572;hpb=7a82762b44f4732f6b075a0cb5d8b258f5022d12;p=distro-setup diff --git a/switch-mail-host b/switch-mail-host old mode 100755 new mode 100644 index bac2148..e52abdb --- a/switch-mail-host +++ b/switch-mail-host @@ -1,36 +1,99 @@ #!/bin/bash -set -x -set -eE -o pipefail -trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR + +err-bash-trace() { + local -i argc_index=0 frame i start=${1:-0} max_indent=8 indent + local source + local extdebug=false + if [[ $(shopt -p extdebug) == *-s* ]]; then + extdebug=true + fi + for ((frame=0; frame < ${#FUNCNAME[@]}-1; frame++)); do + argc=${BASH_ARGC[frame]} + argc_index+=$argc + ((frame < start)) && continue + if (( ${#BASH_SOURCE[@]} > 1 )); then + source="${BASH_SOURCE[frame+1]}:${BASH_LINENO[frame]}:" + fi + indent=$((frame-start + 1)) + indent=$((indent < max_indent ? indent : max_indent)) + printf "%${indent}s↳%sin \`%s" '' "$source" "${FUNCNAME[frame]}" + if $extdebug; then + for ((i=argc_index-1; i >= argc_index-argc; i--)); do + printf " %s" "${BASH_ARGV[i]}" + done + fi + echo \' + done + return 0 +} + + +err-catch() { + set -E; shopt -s extdebug + _err-trap() { + err=$? + exec >&2 + set +x + echo "${BASH_SOURCE[1]}:${BASH_LINENO[0]}: \`$BASH_COMMAND' returned $err" + err-bash-trace 2 + set -e # err trap does not work within an error trap + "${_errcatch_cleanup[@]:-:}" # note :-: is to be compatible with set -u + echo "$0: exiting with code $err" + exit $err + } + trap _err-trap ERR + set -o pipefail +} +err-catch usage() { - cat <