aboutsummaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2021-09-07 02:23:51 +0200
committerDenys Vlasenko <vda.linux@googlemail.com>2021-09-07 02:25:52 +0200
commite53c7dbafc78948e5c0d8d8ccb0bdcd9f936c62e (patch)
tree909286fc381d47fba921621afb809a84997815fc /shell
parentf415e21a7dce1d4f4b760fddfaba85c551681e11 (diff)
downloadbusybox-w32-e53c7dbafc78948e5c0d8d8ccb0bdcd9f936c62e.tar.gz
busybox-w32-e53c7dbafc78948e5c0d8d8ccb0bdcd9f936c62e.tar.bz2
busybox-w32-e53c7dbafc78948e5c0d8d8ccb0bdcd9f936c62e.zip
hush: fix set -n to act immediately, not just after run_list()
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rwxr-xr-xshell/ash_test/ash-misc/exitcode_trap7.tests2
-rw-r--r--shell/hush.c8
-rw-r--r--shell/hush_test/hush-misc/exitcode_trap7.right2
-rwxr-xr-xshell/hush_test/hush-misc/exitcode_trap7.tests7
-rw-r--r--shell/hush_test/hush-misc/set-n1.right3
-rwxr-xr-xshell/hush_test/hush-misc/set-n1.tests2
6 files changed, 21 insertions, 3 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 @@
1$THIS_SH -c ' 1$THIS_SH -c '
2cleanup() { set +e; false; } 2cleanup() { set +e; false; }
3set -eu 3set -e
4trap cleanup EXIT 4trap cleanup EXIT
5echo Start 5echo Start
6' 6'
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)
9898#if ENABLE_HUSH_LOOPS 9898#if ENABLE_HUSH_LOOPS
9899 G.flag_break_continue = 0; 9899 G.flag_break_continue = 0;
9900#endif 9900#endif
9901 rcode = r = run_pipe(pi); /* NB: rcode is a smalluint, r is int */ 9901 rcode = r = G.o_opt[OPT_O_NOEXEC] ? 0 : run_pipe(pi);
9902 /* NB: rcode is a smalluint, r is int */
9902 if (r != -1) { 9903 if (r != -1) {
9903 /* We ran a builtin, function, or group. 9904 /* We ran a builtin, function, or group.
9904 * rcode is already known 9905 * rcode is already known
@@ -10137,7 +10138,10 @@ static int set_mode(int state, char mode, const char *o_opt)
10137 int idx; 10138 int idx;
10138 switch (mode) { 10139 switch (mode) {
10139 case 'n': 10140 case 'n':
10140 G.o_opt[OPT_O_NOEXEC] = state; 10141 /* set -n has no effect in interactive shell */
10142 /* Try: while set -n; do echo $-; done */
10143 if (!G_interactive_fd)
10144 G.o_opt[OPT_O_NOEXEC] = state;
10141 break; 10145 break;
10142 case 'x': 10146 case 'x':
10143 IF_HUSH_MODE_X(G_x_mode = state;) 10147 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 @@
1Start
2Ok:0
diff --git a/shell/hush_test/hush-misc/exitcode_trap7.tests b/shell/hush_test/hush-misc/exitcode_trap7.tests
new file mode 100755
index 000000000..f4b0eb544
--- /dev/null
+++ b/shell/hush_test/hush-misc/exitcode_trap7.tests
@@ -0,0 +1,7 @@
1$THIS_SH -c '
2cleanup() { set +e; false; }
3set -e
4trap cleanup EXIT
5echo Start
6'
7echo Ok:$?
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 @@
1set -n stops in -c?
2YES
3Ok: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 @@
1$THIS_SH -c "echo 'set -n stops in -c?'; set -n; echo NO" && echo YES
2echo Ok:$?