diff options
author | Philippe Altherr <philippe.altherr@gmail.com> | 2022-12-03 20:42:13 -0800 |
---|---|---|
committer | Bart Schaefer <schaefer@zsh.org> | 2022-12-03 20:42:13 -0800 |
commit | d47b8480f0eb883d54fcbef22999bf26d13d56a4 (patch) | |
tree | 70c927d5302e9992d71d676632d07039b121f5e3 /Src/exec.c | |
parent | fda6fd9513ffdbd75c490e8e55ce33f370a9bd17 (diff) | |
download | zsh-d47b8480f0eb883d54fcbef22999bf26d13d56a4.tar.gz zsh-d47b8480f0eb883d54fcbef22999bf26d13d56a4.tar.xz zsh-d47b8480f0eb883d54fcbef22999bf26d13d56a4.zip |
51001: fix for ERR_EXIT with pipeline negation ("!"); update tests
Diffstat (limited to 'Src/exec.c')
-rw-r--r-- | Src/exec.c | 13 |
1 files changed, 8 insertions, 5 deletions
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 ! <list-of-shell-commands> */ + /* suppress errexit for the commands in ! <list-of-commands> */ 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: |