Shell: Add the |& construct for piping stderr along with stdout

When |& is typed, stderr will be piped to stdout before the actual
piping happens. This behaves basically like a 2>&1 | (and the
underlying implementation transforms it to that anyway).
This commit is contained in:
sin-ack 2022-07-16 23:09:03 +00:00 committed by Ali Mohammad Pur
parent 57c8677b5c
commit fbf91f41e7
Notes: sideshowbarker 2024-07-17 08:52:37 +09:00
2 changed files with 14 additions and 2 deletions

View File

@ -510,6 +510,18 @@ RefPtr<AST::Node> Parser::parse_pipe_sequence()
auto before_pipe = save_offset();
consume();
auto also_pipe_stderr = peek() == '&';
if (also_pipe_stderr) {
consume();
RefPtr<AST::Node> redirection;
{
auto redirection_start = push_start();
redirection = create<AST::Fd2FdRedirection>(STDERR_FILENO, STDOUT_FILENO);
}
left = create<AST::Join>(left.release_nonnull(), redirection.release_nonnull());
}
if (auto pipe_seq = parse_pipe_sequence()) {
return create<AST::Pipe>(left.release_nonnull(), pipe_seq.release_nonnull()); // Pipe

View File

@ -200,9 +200,9 @@ heredoc_entries :: { .*? (heredoc_entry) '\n' } [each heredoc_entries]
variable_decls :: identifier '=' expression (' '+ variable_decls)? ' '*
| identifier '=' '(' pipe_sequence ')' (' '+ variable_decls)? ' '*
pipe_sequence :: command '|' pipe_sequence
pipe_sequence :: command '|' '&'? pipe_sequence
| command
| control_structure '|' pipe_sequence
| control_structure '|' '&'? pipe_sequence
| control_structure
control_structure[c] :: for_expr