diff options
author | Peter Stephenson <pws@users.sourceforge.net> | 2002-12-04 13:57:48 +0000 |
---|---|---|
committer | Peter Stephenson <pws@users.sourceforge.net> | 2002-12-04 13:57:48 +0000 |
commit | 28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9 (patch) | |
tree | 114fbfdf69dc40dd86a029573f22b86ead2dfe81 /Src/exec.c | |
parent | 252da01c87086db05083be7e66804e28fcf50c89 (diff) | |
download | zsh-28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9.tar.gz zsh-28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9.tar.xz zsh-28a62d5a4ba6a7eb8361583ad0f6f5b32e1a0ee9.zip |
17979: Add ERR_RETURN option.
Diffstat (limited to 'Src/exec.c')
-rw-r--r-- | Src/exec.c | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/Src/exec.c b/Src/exec.c index ca7b2061f..76ca437f4 100644 --- a/Src/exec.c +++ b/Src/exec.c @@ -924,13 +924,23 @@ sublist_done: dotrap(SIGZERR); donetrap = 1; } - if (lastval && isset(ERREXIT)) { - if (sigtrapped[SIGEXIT]) - dotrap(SIGEXIT); - if (mypid != getpid()) - _exit(lastval); - else - exit(lastval); + if (lastval) { + int errreturn = isset(ERRRETURN) && + (isset(INTERACTIVE) || locallevel || sourcelevel); + int errexit = isset(ERREXIT) || + (isset(ERRRETURN) && !errreturn); + if (errexit) { + if (sigtrapped[SIGEXIT]) + dotrap(SIGEXIT); + if (mypid != getpid()) + _exit(lastval); + else + exit(lastval); + } + if (errreturn) { + retflag = 1; + breaks = loops; + } } } if (ltype & Z_END) |