* [bug] wrong exit status upon (e) flag fatal errors in if/while conditions
@ 2021-05-05 11:07 Stephane Chazelas
2021-05-05 11:47 ` Peter Stephenson
0 siblings, 1 reply; 2+ messages in thread
From: Stephane Chazelas @ 2021-05-05 11:07 UTC (permalink / raw)
To: Zsh hackers list
$ a='${' zsh -c 'if : ${(e)a}; then echo x; fi; echo y'; echo $?
zsh:1: bad substitution
0
$ a='${' zsh -c 'if : ${(e)a}; then echo x; fi; echo y'; echo $?
zsh:1: bad substitution
0
That's when the (e) flag is used in the condition part of an
"if" or "while" (not "until") statement at least.
The shell aborts with an error message but with a success exit
status.
Also, the description of the X flag suggests that error should
be "silently ignored":
DOC> X
DOC> With this flag, parsing errors occurring with the Q, e and # flags
DOC> or the pattern matching forms such as '${NAME#PATTERN}' are
DOC> reported. Without the flag, errors are silently ignored.
See also:
$ a='$(echo ")' zsh -c 'if : ${(Xe)a}; then echo x; fi; echo y'; echo $?
zsh:1: unmatched "
zsh:1: parse error
0
$ a='$(echo ")' zsh -c 'if : ${(e)a}; then echo x; fi; echo y'; echo $?
zsh:1: unmatched "
x
y
0
Here, the X flag does have an effect, but an error is still
reported (even if it doesn't abort the shell) without it.
--
Stephane
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [bug] wrong exit status upon (e) flag fatal errors in if/while conditions
2021-05-05 11:07 [bug] wrong exit status upon (e) flag fatal errors in if/while conditions Stephane Chazelas
@ 2021-05-05 11:47 ` Peter Stephenson
0 siblings, 0 replies; 2+ messages in thread
From: Peter Stephenson @ 2021-05-05 11:47 UTC (permalink / raw)
To: Zsh hackers list
> On 05 May 2021 at 12:07 Stephane Chazelas <stephane@chazelas.org> wrote:
> $ a='${' zsh -c 'if : ${(e)a}; then echo x; fi; echo y'; echo $?
> zsh:1: bad substitution
> 0
> $ a='${' zsh -c 'if : ${(e)a}; then echo x; fi; echo y'; echo $?
> zsh:1: bad substitution
> 0
>
> That's when the (e) flag is used in the condition part of an
> "if" or "while" (not "until") statement at least.
>
> The shell aborts with an error message but with a success exit
> status.
I can do this one; it's quite obvious looking at the code, I think...
BTW this is somewhat obscurely cut and pasted, the actual commit
will come straight from the Linux machine, so don't worry about
any line endings here.
pws
diff --git a/Src/loop.c b/Src/loop.c
index 41b2e5627..aa733a2cb 100644
--- a/Src/loop.c
+++ b/Src/loop.c
@@ -583,7 +583,7 @@ execif(Estate state, int do_exec)
cmdpop();
} else {
noerrexit = olderrexit;
- if (!retflag)
+ if (!retflag && !errflag)
lastval = 0;
}
state->pc = end;
diff --git a/Test/A01grammar.ztst b/Test/A01grammar.ztst
index 35a04e7d5..88fc8606e 100644
--- a/Test/A01grammar.ztst
+++ b/Test/A01grammar.ztst
@@ -939,3 +939,8 @@ F:Note that the behaviour of 'exit' inside try-list inside a function is unspeci
$ZTST_testdir/../Src/zsh -fc '{ ( ) } always { echo foo }'
0:exec last command optimization inhibited for try/always
>foo
+
+ a='${'
+ if : ${(e)a}; then echo x; fi
+1:Status on bad substitution in if without else
+?(eval):2: bad substitution
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2021-05-05 11:47 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-05-05 11:07 [bug] wrong exit status upon (e) flag fatal errors in if/while conditions Stephane Chazelas
2021-05-05 11:47 ` Peter Stephenson
Code repositories for project(s) associated with this public inbox
https://git.vuxu.org/mirror/zsh/
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).