From 104fba0256def796cdcb617cdeb4a6b08fef4741 Mon Sep 17 00:00:00 2001 From: Johannes Schauer Marin Rodrigues Date: Mon, 16 Jan 2023 23:16:11 +0100 Subject: [PATCH] run_null.sh: use file descriptors instead of temporary files to get the exit status of the first part of a pipeline --- run_null.sh | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/run_null.sh b/run_null.sh index e034962..17b42fa 100755 --- a/run_null.sh +++ b/run_null.sh @@ -17,14 +17,24 @@ while [ "$#" -gt 0 ]; do shift done -# subshell so that we can cd without effecting the rest -( - set +e - cd ./shared; - $SUDO sh -x ./test.sh; - echo $?; -) 2>&1 | tee shared/output.txt -if [ "$(cat shared/exitstatus.txt)" -ne 0 ]; then +# - Run command with fds 3 and 4 closed so that whatever test.sh does it +# cannot interfere with these. +# - Both stdin and stderr of test.sh are written to stdout +# - Write exit status of test.sh to fd 3 +# - Write stdout to shared/output.txt as well as to fd 4 +# - Redirect fd 3 to stdout +# - Read fd 3 and let the group exit with that value +# - Redirect fd 4 to stdout +ret=0 +{ { { { + ret=0; + ( exec 3>&- 4>&-; env --chdir=./shared $SUDO sh -x ./test.sh 2>&1) || ret=$?; + echo $ret >&3; + } | tee shared/output.txt >&4; + } 3>&1; + } | { read -r xs; exit "$xs"; } +} 4>&1 || ret=$? +if [ "$ret" -ne 0 ]; then echo "test.sh failed" exit 1 fi