From d3de3bfd203a718c2fb7ff030669517b396e56e9 Mon Sep 17 00:00:00 2001 From: pvincent Date: Tue, 7 Jul 2026 23:42:18 +0400 Subject: [PATCH] working bash-strict --- bin/bash-strict | 37 +++++++++++++++++++++++++------------ test5.sh | 20 ++++++++++++-------- 2 files changed, 37 insertions(+), 20 deletions(-) diff --git a/bin/bash-strict b/bin/bash-strict index d45e0d5..aaf8d91 100755 --- a/bin/bash-strict +++ b/bin/bash-strict @@ -1,29 +1,42 @@ #!/usr/bin/env -S -- bash +# CONSTANTS + +TMP_ERROR=$(mktemp -t "$(basename $0).XXXXXXXX" --tmpdir=/run/user/$(id -u)) + +# FUNCTIONS + function on_exit { code=${1:-0} - echo ON_EXIT2 $code - [[ -s /tmp/error ]] && cat /tmp/error + + stack_lines=("${BASH_LINENO[@]}") + stack_functions=("${FUNCNAME[@]}") + stack_sources=("${BASH_SOURCE[@]}") + + tmp_error=${2:-/dev/null} + echo "ERROR #${code} due to:" + [[ -s $tmp_error ]] && cat $tmp_error && rm $tmp_error + + echo "${stack_lines[@]}" + echo "${stack_functions[@]}" + echo "${stack_sources[@]}" + trap - ERR TERM INT EXIT builtin exit $code } -echo BASH_STRICT $@ -echo ---------- +# MAIN command=$1 shift args=("$@") args2=() -for i in "${args[@]}"; do - echo ARG: $i - args2+=("${i@Q}") -done -echo "----$command ${args2[@]}------" +for i in "${args[@]}"; do 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 +# echo PROCESS START +bash -c "set -TEue -o pipefail; trap 'on_exit \$? $TMP_ERROR' ERR TERM INT EXIT; source $command ${args2[*]}" 3>&1 1>&2 2>&3 | tee $TMP_ERROR +# echo PROCESS END succesfully diff --git a/test5.sh b/test5.sh index 1832f37..c611484 100755 --- a/test5.sh +++ b/test5.sh @@ -1,15 +1,19 @@ -#!/usr/bin/env -S -- bash-strict +#!/usr/bin/bash-strict +##!/usr/bin/env -S -- bash-strict -# source lib/halt.bash +function f2 { -# _BACKTRACE=${_BACKTRACE:-false} -# echo TEST5_BACKTRACE=$_BACKTRACE + unknown_command + echo $nope +} -echo START TEST5 $@ +function f1 { + f2 +} + +echo START TEST5 for i in "$@"; do echo ARG: $i done -# blabla -unknown_command -# echo $nope +f1 echo END TEST5