sh: Change ! within a pipeline to start a new pipeline instead.

This is how ksh93 treats ! within a pipeline and makes the ! in
  a | ! b | c
negate the exit status of the pipeline, as if it were
  a | { ! b | c; }

Side effect: something like
  f() ! a
is now a syntax error, because a function definition takes a command,
not a pipeline.

Exp-run done by:	pav (with some other sh(1) changes)
This commit is contained in:
Jilles Tjoelker 2010-10-24 17:06:49 +00:00
parent 281fb05e83
commit ba08f69b5c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214281
2 changed files with 14 additions and 19 deletions

View File

@ -328,7 +328,7 @@ pipeline(void)
{
union node *n1, *n2, *pipenode;
struct nodelist *lp, *prev;
int negate;
int negate, t;
negate = 0;
checkkwd = 2;
@ -347,7 +347,13 @@ pipeline(void)
do {
prev = lp;
lp = (struct nodelist *)stalloc(sizeof (struct nodelist));
lp->n = command();
checkkwd = 2;
t = readtoken();
tokpushback++;
if (t == TNOT)
lp->n = pipeline();
else
lp->n = command();
prev->next = lp;
} while (readtoken() == TPIPE);
lp->next = NULL;
@ -372,7 +378,7 @@ command(void)
union node *ap, **app;
union node *cp, **cpp;
union node *redir, **rpp;
int t, negate = 0;
int t;
checkkwd = 2;
redir = NULL;
@ -387,12 +393,6 @@ command(void)
}
tokpushback++;
while (readtoken() == TNOT) {
TRACE(("command: TNOT recognized\n"));
negate = !negate;
}
tokpushback++;
switch (readtoken()) {
case TIF:
n1 = (union node *)stalloc(sizeof (struct nif));
@ -573,7 +573,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
case TRP:
tokpushback++;
n1 = simplecmd(rpp, redir);
goto checkneg;
return n1;
default:
synexpect(-1);
}
@ -596,15 +596,7 @@ TRACE(("expecting DO got %s %s\n", tokname[got], got == TWORD ? wordtext : ""));
n1->nredir.redirect = redir;
}
checkneg:
if (negate) {
n2 = (union node *)stalloc(sizeof (struct nnot));
n2->type = NNOT;
n2->nnot.com = n1;
return n2;
}
else
return n1;
return n1;
}

View File

@ -0,0 +1,3 @@
# $FreeBSD$
: | ! : | false