aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--utils/lit/lit/ShUtil.py19
1 files changed, 15 insertions, 4 deletions
diff --git a/utils/lit/lit/ShUtil.py b/utils/lit/lit/ShUtil.py
index dda622a48a..0c5bdac408 100644
--- a/utils/lit/lit/ShUtil.py
+++ b/utils/lit/lit/ShUtil.py
@@ -134,6 +134,8 @@ class ShLexer:
if c == '|':
if self.maybe_eat('|'):
return ('||',)
+ if self.maybe_eat('&'):
+ return ('|&',)
return (c,)
if c == '&':
if self.maybe_eat('&'):
@@ -205,7 +207,7 @@ class ShParser:
# Otherwise see if it is a terminator.
assert isinstance(tok, tuple)
- if tok[0] in ('|',';','&','||','&&'):
+ if tok[0] in ('|','|&',';','&','||','&&'):
break
# Otherwise it must be a redirection.
@@ -224,9 +226,18 @@ class ShParser:
negate = True
commands = [self.parse_command()]
- while self.look() == ('|',):
- self.lex()
- commands.append(self.parse_command())
+ while 1:
+ tok = self.look()
+ if tok == ('|',):
+ self.lex()
+ commands.append(self.parse_command())
+ continue
+ if tok == ('|&',):
+ self.lex()
+ commands[-1].redirects.insert(0, (('>&',2),'1'))
+ commands.append(self.parse_command())
+ continue
+ break
return Pipeline(commands, negate)
def parse(self):