>Synopsis:      ksh: failing eval stops execution even when in OR-list
>Category:      user
>Environment:
        System      : OpenBSD 6.6
        Details     : OpenBSD 6.6 (GENERIC.MP) #3: Thu Nov 21 03:20:01 MST 2019
                          
r...@syspatch-66-amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP

        Architecture: OpenBSD.amd64
        Machine     : amd64
>Description:
When under "set -e", using "eval" in an OR-list, a failure during evaluation
of the eval string will stop the shell, and not trigger the OR-list:

set -e
eval false || true
echo pass

Output of this script on OpenBSD:

$ sh sete.sh ; echo $?
1

Output with various other shells:

% ksh93 sete.sh
pass
% dash sete.sh 
pass
% posh sete.sh
pass
% yash sete.sh
pass
% mksh sete.sh
pass
% bash sete.sh
pass
% zsh sete.sh 
pass
% busybox sh sete.sh
pass

I think this is in violation of the POSIX 2008 specification:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#set
> The -e setting shall be ignored when executing the compound list
> following the while, until, if, or elif reserved word, a pipeline
> beginning with the ! reserved word, or any command of an AND-OR list
> other than the last.

>How-To-Repeat:
Running this script as a reproducer:

set -e
eval false || true
echo pass

>Fix:
As a workaround: eval "false || true" || true

Thanks,
-- 
Leah Neukirchen  <l...@vuxu.org>  https://leahneukirchen.org/

Reply via email to