From d47b8480f0eb883d54fcbef22999bf26d13d56a4 Mon Sep 17 00:00:00 2001 From: Philippe Altherr Date: Sat, 3 Dec 2022 20:42:13 -0800 Subject: 51001: fix for ERR_EXIT with pipeline negation ("!"); update tests --- Src/exec.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) (limited to 'Src/exec.c') diff --git a/Src/exec.c b/Src/exec.c index b0f42ae67..d8501ca68 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -63,7 +63,10 @@ typedef struct funcsave *Funcsave; /**/ int noerrexit; -/* used to suppress ERREXIT or ERRRETURN for one occurrence: 0 or 1 */ +/* + * used to suppress ERREXIT and ERRRETURN for the command under evaluation. + * 0 or 1 + */ /**/ int this_noerrexit; @@ -1429,10 +1432,7 @@ execlist(Estate state, int dont_change_job, int exiting) if (!oldnoerrexit) noerrexit = isend ? 0 : NOERREXIT_EXIT | NOERREXIT_RETURN; if (WC_SUBLIST_FLAGS(code) & WC_SUBLIST_NOT) { - /* suppress errexit for "! this_command" */ - if (isend) - this_noerrexit = 1; - /* suppress errexit for ! */ + /* suppress errexit for the commands in ! */ noerrexit = NOERREXIT_EXIT | NOERREXIT_RETURN; } switch (WC_SUBLIST_TYPE(code)) { @@ -1443,6 +1443,9 @@ execlist(Estate state, int dont_change_job, int exiting) else execpline(state, code, ltype, (ltype & Z_END) && exiting); state->pc = next; + /* suppress errexit for the command "! ..." */ + if (WC_SUBLIST_FLAGS(code) & WC_SUBLIST_NOT) + this_noerrexit = 1; goto sublist_done; break; case WC_SUBLIST_AND: -- cgit 1.4.1