diff options
author | jilles <jilles@FreeBSD.org> | 2010-10-24 17:06:49 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2010-10-24 17:06:49 +0000 |
commit | ba204fa87ef51371c7252b651a25912e15f77a2c (patch) | |
tree | 019171bb8e78523fbc40850edbd14c21f8b83ddf /bin/sh/parser.c | |
parent | dfb434120d3ba49a9baa9b964bbca52885f58614 (diff) | |
download | FreeBSD-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/sh/parser.c')
-rw-r--r-- | bin/sh/parser.c | 30 |
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; } |