From 54d8399718b0f565e0b195f4b897b2137aa44f8a Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Mon, 17 Dec 2018 12:09:49 +0000 Subject: [PATCH] minimal/do: fix t/000-set-minus-e on some shells. Running commands in "||" context (like "x || return") disables "set -e" behaviour in that context, even several levels deep in the call hierarchy. The exact behaviour varies between shells, but this caused a test failure with at least zsh 5.3.1 on debian. --- minimal/do | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/minimal/do b/minimal/do index 6a70880..d2ec992 100755 --- a/minimal/do +++ b/minimal/do @@ -273,6 +273,8 @@ _run_dofile() exec /$cmd "$PWD/$dofile" "$@" else set -$_do_opt_verbose$_do_opt_exec + # If $dofile is empty, "." might not change $? at + # all, so we clear it first with ":". :; . "$PWD/$dofile" fi } @@ -336,7 +338,12 @@ _do() # if that's zero length too, forget it [ -s "$tmp" ] || rm -f "$tmp" fi - ) 3>$qtmp 4<$qtmp || return + ) 3>$qtmp 4<$qtmp # can't use "|| return" here... + # ...because "|| return" would mess up "set -e" inside the () + # on some shells. Running commands in "||" context, even + # deep inside, will stop "set -e" from functioning. + rv=$? + [ "$rv" = 0 ] || return "$rv" mv "$tmp" "$target" 2>/dev/null [ -e "$target.did.tmp" ] && mv "$target.did.tmp" "$target.did" ||