From 59f52fe3467a714c203b8a2dcddb1163ea40bebb Mon Sep 17 00:00:00 2001 From: pvincent Date: Tue, 7 Jul 2026 22:50:37 +0400 Subject: [PATCH] bash-strict --- bin/bash-strict | 29 +++++++++++++++++++++++++++ lib/halt.bash | 52 +++++++++++++++++++++++++++++++++++++++++++++++++ test5.sh | 15 ++++++++++++++ test6.sh | 15 ++++++++++++++ 4 files changed, 111 insertions(+) create mode 100755 bin/bash-strict create mode 100644 lib/halt.bash create mode 100755 test5.sh create mode 100755 test6.sh diff --git a/bin/bash-strict b/bin/bash-strict new file mode 100755 index 0000000..d45e0d5 --- /dev/null +++ b/bin/bash-strict @@ -0,0 +1,29 @@ +#!/usr/bin/env -S -- bash + +function on_exit { + code=${1:-0} + echo ON_EXIT2 $code + [[ -s /tmp/error ]] && cat /tmp/error + trap - ERR TERM INT EXIT + builtin exit $code +} + +echo BASH_STRICT $@ +echo ---------- + +command=$1 +shift +args=("$@") +args2=() +for i in "${args[@]}"; do + echo ARG: $i + args2+=("${i@Q}") +done +echo "----$command ${args2[@]}------" + +set -TEue -o pipefail +export -f on_exit +echo PROCESS START +bash -c "set -TEue -o pipefail; trap 'on_exit \$?' ERR TERM INT EXIT; source $command ${args2[*]}" 3>&1 1>&2 2>&3 | tee /tmp/error +echo PROCESS END succesfully + diff --git a/lib/halt.bash b/lib/halt.bash new file mode 100644 index 0000000..6eb7428 --- /dev/null +++ b/lib/halt.bash @@ -0,0 +1,52 @@ +function blabla { + echo IN blabla OUT +} + +function exit { + local error_code stack_lines stack_functions stack_sources + error_code=${1:-0} + + stack_lines=("${BASH_LINENO[@]}") + stack_functions=("${FUNCNAME[@]}") + stack_sources=("${BASH_SOURCE[@]}") + + unset stack_functions[0] + unset stack_sources[0] + unset stack_lines[-1] + if [[ $error_code > 0 ]]; then + printf "\nEXIT #${error_code} due to error at line ${stack_lines} : \n-----------------------------------------\n" + [[ -s /tmp/error ]] && echo -ne 'CAUSE:\t\t' && cat /tmp/error + echo -e "FUNCNAME:\t${stack_functions[@]}" >&2 # inner outer main + echo -e "BASH_SOURCE:\t${stack_sources[@]}" >&2 + echo -e "BASH_LINENO:\t${stack_lines[@]}" >&2 + trap - ERR TERM INT EXIT + builtin exit "${error_code}" + else + echo __REAL_SUCCESS + fi +} + +function _backtrace_perform { + echo LAUNCH script... + export -f exit + export -f blabla + set -TEue + trap 'exit $?' ERR TERM INT EXIT + + source=${BASH_SOURCE[-1]} + _BACKTRACE=true + export _BACKTRACE + + echo call1 exec $source $* + bash -c "set -TEue; trap 'exit $?' ERR TERM INT EXIT; source $source $*" 3>&1 1>&2 2>&3 | tee /tmp/error + + trap - ERR TERM INT EXIT + builtin exit + echo NOT VISIBLE + +} + +_BACKTRACE=${_BACKTRACE:-false} +echo _BACKTRACE=${_BACKTRACE} +${_BACKTRACE} && return +_backtrace_perform diff --git a/test5.sh b/test5.sh new file mode 100755 index 0000000..1832f37 --- /dev/null +++ b/test5.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env -S -- bash-strict + +# source lib/halt.bash + +# _BACKTRACE=${_BACKTRACE:-false} +# echo TEST5_BACKTRACE=$_BACKTRACE + +echo START TEST5 $@ +for i in "$@"; do + echo ARG: $i +done +# blabla +unknown_command +# echo $nope +echo END TEST5 diff --git a/test6.sh b/test6.sh new file mode 100755 index 0000000..ee3c449 --- /dev/null +++ b/test6.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env -S -- bash-script + +# source lib/halt.bash + +# _BACKTRACE=${_BACKTRACE:-false} +# echo TEST5_BACKTRACE=$_BACKTRACE + +echo START TEST5 $@ +for i in "$@"; do + echo ARG: $i +done +# blabla +unknown_command +# echo $nope +echo END TEST5