sh: Fix two things about {(...)} <redir:
* In {(...) <redir1;} <redir2, do not drop redir1. * Maintain the difference between (...) <redir and {(...)} <redir: In (...) <redir, the redirection is performed in the child, while in {(...)} <redir it should be performed in the parent (like {(...); :;} <redir)
This commit is contained in:
parent
c059d82290
commit
b15e9aa322
@ -389,8 +389,10 @@ command(void)
|
||||
union node *cp, **cpp;
|
||||
union node *redir, **rpp;
|
||||
int t;
|
||||
int is_subshell;
|
||||
|
||||
checkkwd = CHKNL | CHKKWD | CHKALIAS;
|
||||
is_subshell = 0;
|
||||
redir = NULL;
|
||||
n1 = NULL;
|
||||
rpp = &redir;
|
||||
@ -558,6 +560,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
|
||||
if (readtoken() != TRP)
|
||||
synexpect(TRP);
|
||||
checkkwd = CHKKWD | CHKALIAS;
|
||||
is_subshell = 1;
|
||||
break;
|
||||
case TBEGIN:
|
||||
n1 = list(0, 0);
|
||||
@ -596,7 +599,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
|
||||
tokpushback++;
|
||||
*rpp = NULL;
|
||||
if (redir) {
|
||||
if (n1->type != NSUBSHELL) {
|
||||
if (!is_subshell) {
|
||||
n2 = (union node *)stalloc(sizeof (struct nredir));
|
||||
n2->type = NREDIR;
|
||||
n2->nredir.n = n1;
|
||||
|
3
tools/regression/bin/sh/execution/redir5.0
Normal file
3
tools/regression/bin/sh/execution/redir5.0
Normal file
@ -0,0 +1,3 @@
|
||||
# $FreeBSD$
|
||||
|
||||
{ (echo bad) >/dev/null; } </dev/null
|
Loading…
x
Reference in New Issue
Block a user