hush: fix set -n to act immediately, not just after run_list()

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2021-09-07 02:23:51 +02:00
parent f415e21a7d
commit e53c7dbafc
6 changed files with 21 additions and 3 deletions

View File

@ -1,6 +1,6 @@
$THIS_SH -c '
cleanup() { set +e; false; }
set -eu
set -e
trap cleanup EXIT
echo Start
'

View File

@ -9898,7 +9898,8 @@ static int run_list(struct pipe *pi)
#if ENABLE_HUSH_LOOPS
G.flag_break_continue = 0;
#endif
rcode = r = run_pipe(pi); /* NB: rcode is a smalluint, r is int */
rcode = r = G.o_opt[OPT_O_NOEXEC] ? 0 : run_pipe(pi);
/* NB: rcode is a smalluint, r is int */
if (r != -1) {
/* We ran a builtin, function, or group.
* rcode is already known
@ -10137,7 +10138,10 @@ static int set_mode(int state, char mode, const char *o_opt)
int idx;
switch (mode) {
case 'n':
G.o_opt[OPT_O_NOEXEC] = state;
/* set -n has no effect in interactive shell */
/* Try: while set -n; do echo $-; done */
if (!G_interactive_fd)
G.o_opt[OPT_O_NOEXEC] = state;
break;
case 'x':
IF_HUSH_MODE_X(G_x_mode = state;)

View File

@ -0,0 +1,2 @@
Start
Ok:0

View File

@ -0,0 +1,7 @@
$THIS_SH -c '
cleanup() { set +e; false; }
set -e
trap cleanup EXIT
echo Start
'
echo Ok:$?

View File

@ -0,0 +1,3 @@
set -n stops in -c?
YES
Ok:0

View File

@ -0,0 +1,2 @@
$THIS_SH -c "echo 'set -n stops in -c?'; set -n; echo NO" && echo YES
echo Ok:$?