svn commit: r214281 - in head: bin/sh tools/regression/bin/sh/parser
Jilles Tjoelker
jilles at FreeBSD.org
Sun Oct 24 17:06:50 UTC 2010
Author: jilles
Date: Sun Oct 24 17:06:49 2010
New Revision: 214281
URL: http://svn.freebsd.org/changeset/base/214281
Log:
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)
Added:
head/tools/regression/bin/sh/parser/pipe-not1.0 (contents, props changed)
Modified:
head/bin/sh/parser.c
Modified: head/bin/sh/parser.c
==============================================================================
--- head/bin/sh/parser.c Sun Oct 24 16:55:17 2010 (r214280)
+++ head/bin/sh/parser.c Sun Oct 24 17:06:49 2010 (r214281)
@@ -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", tokna
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", tokna
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;
}
Added: head/tools/regression/bin/sh/parser/pipe-not1.0
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/tools/regression/bin/sh/parser/pipe-not1.0 Sun Oct 24 17:06:49 2010 (r214281)
@@ -0,0 +1,3 @@
+# $FreeBSD$
+
+: | ! : | false
More information about the svn-src-head
mailing list