diff --git a/utils/lit/lit/ShUtil.py b/utils/lit/lit/ShUtil.py index dda622a48a8..0c5bdac408a 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):