diff options
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/shell/ash.c b/shell/ash.c index 1eddec4ea..913f0ce22 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -10473,9 +10473,18 @@ evalsubshell(union node *n, int flags) | |||
10473 | 10473 | ||
10474 | errlinno = lineno = n->nredir.linno; | 10474 | errlinno = lineno = n->nredir.linno; |
10475 | 10475 | ||
10476 | #if ENABLE_PLATFORM_MINGW32 | ||
10477 | if (!backgnd && (flags & EV_EXIT) && !may_have_traps) { | ||
10478 | expredir(n->nredir.redirect); | ||
10479 | redirect(n->nredir.redirect, 0); | ||
10480 | evaltreenr(n->nredir.n, flags); | ||
10481 | /* never returns */ | ||
10482 | } | ||
10483 | #else | ||
10476 | expredir(n->nredir.redirect); | 10484 | expredir(n->nredir.redirect); |
10477 | if (!backgnd && (flags & EV_EXIT) && !may_have_traps) | 10485 | if (!backgnd && (flags & EV_EXIT) && !may_have_traps) |
10478 | goto nofork; | 10486 | goto nofork; |
10487 | #endif | ||
10479 | INT_OFF; | 10488 | INT_OFF; |
10480 | if (backgnd == FORK_FG) | 10489 | if (backgnd == FORK_FG) |
10481 | get_tty_state(); | 10490 | get_tty_state(); |
@@ -10486,7 +10495,6 @@ evalsubshell(union node *n, int flags) | |||
10486 | fs.n = n; | 10495 | fs.n = n; |
10487 | fs.flags = flags; | 10496 | fs.flags = flags; |
10488 | spawn_forkshell(&fs, jp, n, backgnd); | 10497 | spawn_forkshell(&fs, jp, n, backgnd); |
10489 | if ( 0 ) { | ||
10490 | #else | 10498 | #else |
10491 | if (forkshell(jp, n, backgnd) == 0) { | 10499 | if (forkshell(jp, n, backgnd) == 0) { |
10492 | /* child */ | 10500 | /* child */ |
@@ -10494,12 +10502,12 @@ evalsubshell(union node *n, int flags) | |||
10494 | flags |= EV_EXIT; | 10502 | flags |= EV_EXIT; |
10495 | if (backgnd) | 10503 | if (backgnd) |
10496 | flags &= ~EV_TESTED; | 10504 | flags &= ~EV_TESTED; |
10497 | #endif | ||
10498 | nofork: | 10505 | nofork: |
10499 | redirect(n->nredir.redirect, 0); | 10506 | redirect(n->nredir.redirect, 0); |
10500 | evaltreenr(n->nredir.n, flags); | 10507 | evaltreenr(n->nredir.n, flags); |
10501 | /* never returns */ | 10508 | /* never returns */ |
10502 | } | 10509 | } |
10510 | #endif | ||
10503 | /* parent */ | 10511 | /* parent */ |
10504 | status = 0; | 10512 | status = 0; |
10505 | if (backgnd == FORK_FG) | 10513 | if (backgnd == FORK_FG) |
@@ -16114,6 +16122,8 @@ forkshell_evalsubshell(struct forkshell *fs) | |||
16114 | TRACE(("ash: subshell: %s\n",__PRETTY_FUNCTION__)); | 16122 | TRACE(("ash: subshell: %s\n",__PRETTY_FUNCTION__)); |
16115 | INT_ON; | 16123 | INT_ON; |
16116 | flags |= EV_EXIT; | 16124 | flags |= EV_EXIT; |
16125 | if (fs->mode) | ||
16126 | flags &= ~EV_TESTED; | ||
16117 | expredir(n->nredir.redirect); | 16127 | expredir(n->nredir.redirect); |
16118 | redirect(n->nredir.redirect, 0); | 16128 | redirect(n->nredir.redirect, 0); |
16119 | evaltreenr(n->nredir.n, flags); | 16129 | evaltreenr(n->nredir.n, flags); |