mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-01-01 05:16:05 +01:00
39540: "! command" should suppress ERR_EXIT and ERR_RETURN
This commit is contained in:
parent
4f2a1810f2
commit
6b2585147b
3 changed files with 48 additions and 2 deletions
|
@ -1,3 +1,8 @@
|
|||
2016-10-02 Peter Stephenson <p.w.stephenson@ntlworld.com>
|
||||
|
||||
* 39540: Src/exec.c, Test/C03traps.ztst: "! command" should
|
||||
suppress ERR_EXIT and ERR_RETURN.
|
||||
|
||||
2016-09-30 Daniel Shahaf <d.s@daniel.shahaf.name>
|
||||
|
||||
* 39495: Doc/Zsh/contrib.yo, Functions/Misc/add-zle-hook-widget:
|
||||
|
|
|
@ -1226,6 +1226,7 @@ execlist(Estate state, int dont_change_job, int exiting)
|
|||
}
|
||||
while (wc_code(code) == WC_LIST && !breaks && !retflag && !errflag) {
|
||||
int donedebug;
|
||||
int this_noerrexit = 0;
|
||||
|
||||
ltype = WC_LIST_TYPE(code);
|
||||
csp = cmdsp;
|
||||
|
@ -1309,9 +1310,12 @@ execlist(Estate state, int dont_change_job, int exiting)
|
|||
goto sublist_done;
|
||||
}
|
||||
while (wc_code(code) == WC_SUBLIST) {
|
||||
int isend = (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END);
|
||||
next = state->pc + WC_SUBLIST_SKIP(code);
|
||||
if (!oldnoerrexit)
|
||||
noerrexit = (WC_SUBLIST_TYPE(code) != WC_SUBLIST_END);
|
||||
noerrexit = !isend;
|
||||
if ((WC_SUBLIST_FLAGS(code) & WC_SUBLIST_NOT) && isend)
|
||||
this_noerrexit = 1;
|
||||
switch (WC_SUBLIST_TYPE(code)) {
|
||||
case WC_SUBLIST_END:
|
||||
/* End of sublist; just execute, ignoring status. */
|
||||
|
@ -1427,7 +1431,7 @@ sublist_done:
|
|||
/* Check whether we are suppressing traps/errexit *
|
||||
* (typically in init scripts) and if we haven't *
|
||||
* already performed them for this sublist. */
|
||||
if (!noerrexit && !donetrap) {
|
||||
if (!noerrexit && !this_noerrexit && !donetrap) {
|
||||
if (sigtrapped[SIGZERR] && lastval) {
|
||||
dotrap(SIGZERR);
|
||||
donetrap = 1;
|
||||
|
|
|
@ -519,6 +519,43 @@
|
|||
>Yes
|
||||
F:Must be tested with a top-level script rather than source or function
|
||||
|
||||
fn() {
|
||||
emulate -L zsh
|
||||
setopt errreturn
|
||||
print before
|
||||
false
|
||||
print after
|
||||
}
|
||||
fn
|
||||
1:ERRRETURN, basic case
|
||||
>before
|
||||
|
||||
fn() {
|
||||
emulate -L zsh
|
||||
setopt errreturn
|
||||
print before
|
||||
! true
|
||||
! false
|
||||
print after
|
||||
}
|
||||
fn
|
||||
0:ERRETURN with "!"
|
||||
>before
|
||||
>after
|
||||
|
||||
fn() {
|
||||
emulate -L zsh
|
||||
setopt errreturn
|
||||
print before
|
||||
! true
|
||||
! false
|
||||
false
|
||||
print after
|
||||
}
|
||||
fn
|
||||
1:ERRETURN with "!" and a following false
|
||||
>before
|
||||
|
||||
%clean
|
||||
|
||||
rm -f TRAPEXIT
|
||||
|
|
Loading…
Reference in a new issue