summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authorjilles <jilles@FreeBSD.org>2010-10-24 17:06:49 +0000
committerjilles <jilles@FreeBSD.org>2010-10-24 17:06:49 +0000
commitba204fa87ef51371c7252b651a25912e15f77a2c (patch)
tree019171bb8e78523fbc40850edbd14c21f8b83ddf /bin
parentdfb434120d3ba49a9baa9b964bbca52885f58614 (diff)
downloadFreeBSD-src-ba204fa87ef51371c7252b651a25912e15f77a2c.zip
FreeBSD-src-ba204fa87ef51371c7252b651a25912e15f77a2c.tar.gz
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)
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/parser.c30
1 files changed, 11 insertions, 19 deletions
diff --git a/bin/sh/parser.c b/bin/sh/parser.c
index 018b698..6c504e5 100644
--- a/bin/sh/parser.c
+++ b/bin/sh/parser.c
@@ -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;
}
OpenPOWER on IntegriCloud