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:
parent
281fb05e83
commit
ba08f69b5c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=214281
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
3
tools/regression/bin/sh/parser/pipe-not1.0
Normal file
3
tools/regression/bin/sh/parser/pipe-not1.0
Normal file
@ -0,0 +1,3 @@
|
||||
# $FreeBSD$
|
||||
|
||||
: | ! : | false
|
Loading…
Reference in New Issue
Block a user