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

Denys Vlasenko vda.linux at googlemail.com
Tue Sep 7 00:25:52 UTC 2021


commit: https://git.busybox.net/busybox/commit/?id=e53c7dbafc78948e5c0d8d8ccb0bdcd9f936c62e
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash_test/ash-misc/exitcode_trap7.tests                      | 2 +-
 shell/hush.c                                                      | 8 ++++++--
 shell/hush_test/hush-misc/exitcode_trap7.right                    | 2 ++
 .../ash-misc => hush_test/hush-misc}/exitcode_trap7.tests         | 2 +-
 shell/hush_test/hush-misc/set-n1.right                            | 3 +++
 shell/hush_test/hush-misc/set-n1.tests                            | 2 ++
 6 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/shell/ash_test/ash-misc/exitcode_trap7.tests b/shell/ash_test/ash-misc/exitcode_trap7.tests
index 9772a7b8c..f4b0eb544 100755
--- a/shell/ash_test/ash-misc/exitcode_trap7.tests
+++ b/shell/ash_test/ash-misc/exitcode_trap7.tests
@@ -1,6 +1,6 @@
 $THIS_SH -c '
 cleanup() { set +e; false; }
-set -eu
+set -e
 trap cleanup EXIT
 echo Start
 '
diff --git a/shell/hush.c b/shell/hush.c
index 27092c12f..5fafa322c 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -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;)
diff --git a/shell/hush_test/hush-misc/exitcode_trap7.right b/shell/hush_test/hush-misc/exitcode_trap7.right
new file mode 100644
index 000000000..07d66e9d9
--- /dev/null
+++ b/shell/hush_test/hush-misc/exitcode_trap7.right
@@ -0,0 +1,2 @@
+Start
+Ok:0
diff --git a/shell/ash_test/ash-misc/exitcode_trap7.tests b/shell/hush_test/hush-misc/exitcode_trap7.tests
similarity index 91%
copy from shell/ash_test/ash-misc/exitcode_trap7.tests
copy to shell/hush_test/hush-misc/exitcode_trap7.tests
index 9772a7b8c..f4b0eb544 100755
--- a/shell/ash_test/ash-misc/exitcode_trap7.tests
+++ b/shell/hush_test/hush-misc/exitcode_trap7.tests
@@ -1,6 +1,6 @@
 $THIS_SH -c '
 cleanup() { set +e; false; }
-set -eu
+set -e
 trap cleanup EXIT
 echo Start
 '
diff --git a/shell/hush_test/hush-misc/set-n1.right b/shell/hush_test/hush-misc/set-n1.right
new file mode 100644
index 000000000..ac01831a7
--- /dev/null
+++ b/shell/hush_test/hush-misc/set-n1.right
@@ -0,0 +1,3 @@
+set -n stops in -c?
+YES
+Ok:0
diff --git a/shell/hush_test/hush-misc/set-n1.tests b/shell/hush_test/hush-misc/set-n1.tests
new file mode 100755
index 000000000..90d0f9146
--- /dev/null
+++ b/shell/hush_test/hush-misc/set-n1.tests
@@ -0,0 +1,2 @@
+$THIS_SH -c "echo 'set -n stops in -c?'; set -n; echo NO" && echo YES
+echo Ok:$?


More information about the busybox-cvs mailing list