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:
Jilles Tjoelker 2011-02-05 15:02:19 +00:00
parent c059d82290
commit b15e9aa322
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=218325
2 changed files with 7 additions and 1 deletions

View file

@ -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;

View file

@ -0,0 +1,3 @@
# $FreeBSD$
{ (echo bad) >/dev/null; } </dev/null