mirror of
git://git.code.sf.net/p/zsh/code
synced 2025-09-17 15:01:40 +02: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>
|
2016-09-30 Daniel Shahaf <d.s@daniel.shahaf.name>
|
||||||
|
|
||||||
* 39495: Doc/Zsh/contrib.yo, Functions/Misc/add-zle-hook-widget:
|
* 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) {
|
while (wc_code(code) == WC_LIST && !breaks && !retflag && !errflag) {
|
||||||
int donedebug;
|
int donedebug;
|
||||||
|
int this_noerrexit = 0;
|
||||||
|
|
||||||
ltype = WC_LIST_TYPE(code);
|
ltype = WC_LIST_TYPE(code);
|
||||||
csp = cmdsp;
|
csp = cmdsp;
|
||||||
|
@ -1309,9 +1310,12 @@ execlist(Estate state, int dont_change_job, int exiting)
|
||||||
goto sublist_done;
|
goto sublist_done;
|
||||||
}
|
}
|
||||||
while (wc_code(code) == WC_SUBLIST) {
|
while (wc_code(code) == WC_SUBLIST) {
|
||||||
|
int isend = (WC_SUBLIST_TYPE(code) == WC_SUBLIST_END);
|
||||||
next = state->pc + WC_SUBLIST_SKIP(code);
|
next = state->pc + WC_SUBLIST_SKIP(code);
|
||||||
if (!oldnoerrexit)
|
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)) {
|
switch (WC_SUBLIST_TYPE(code)) {
|
||||||
case WC_SUBLIST_END:
|
case WC_SUBLIST_END:
|
||||||
/* End of sublist; just execute, ignoring status. */
|
/* End of sublist; just execute, ignoring status. */
|
||||||
|
@ -1427,7 +1431,7 @@ sublist_done:
|
||||||
/* Check whether we are suppressing traps/errexit *
|
/* Check whether we are suppressing traps/errexit *
|
||||||
* (typically in init scripts) and if we haven't *
|
* (typically in init scripts) and if we haven't *
|
||||||
* already performed them for this sublist. */
|
* already performed them for this sublist. */
|
||||||
if (!noerrexit && !donetrap) {
|
if (!noerrexit && !this_noerrexit && !donetrap) {
|
||||||
if (sigtrapped[SIGZERR] && lastval) {
|
if (sigtrapped[SIGZERR] && lastval) {
|
||||||
dotrap(SIGZERR);
|
dotrap(SIGZERR);
|
||||||
donetrap = 1;
|
donetrap = 1;
|
||||||
|
|
|
@ -519,6 +519,43 @@
|
||||||
>Yes
|
>Yes
|
||||||
F:Must be tested with a top-level script rather than source or function
|
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
|
%clean
|
||||||
|
|
||||||
rm -f TRAPEXIT
|
rm -f TRAPEXIT
|
||||||
|
|
Loading…
Reference in a new issue