implemented err pipes
This commit is contained in:
@@ -702,7 +702,7 @@ impl Dispatcher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn exec_pipeline(&mut self, pipeline: Node) -> ShResult<()> {
|
fn exec_pipeline(&mut self, pipeline: Node) -> ShResult<()> {
|
||||||
let NdRule::Pipeline { cmds, pipe_err: _ } = pipeline.class else {
|
let NdRule::Pipeline { cmds } = pipeline.class else {
|
||||||
unreachable!()
|
unreachable!()
|
||||||
};
|
};
|
||||||
self.job_stack.new_job();
|
self.job_stack.new_job();
|
||||||
@@ -726,6 +726,10 @@ impl Dispatcher {
|
|||||||
}
|
}
|
||||||
if let Some(pipe) = wpipe {
|
if let Some(pipe) = wpipe {
|
||||||
self.io_stack.push_to_frame(pipe);
|
self.io_stack.push_to_frame(pipe);
|
||||||
|
if cmd.flags.contains(NdFlags::PIPE_ERR) {
|
||||||
|
let err_redir = Redir::new(IoMode::Fd { tgt_fd: STDERR_FILENO, src_fd: STDOUT_FILENO }, RedirType::Output);
|
||||||
|
self.io_stack.push_to_frame(err_redir);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
for redir in std::mem::take(&mut out_redirs) {
|
for redir in std::mem::take(&mut out_redirs) {
|
||||||
self.io_stack.push_to_frame(redir);
|
self.io_stack.push_to_frame(redir);
|
||||||
|
|||||||
@@ -216,7 +216,6 @@ impl Node {
|
|||||||
}
|
}
|
||||||
NdRule::Pipeline {
|
NdRule::Pipeline {
|
||||||
ref mut cmds,
|
ref mut cmds,
|
||||||
pipe_err: _,
|
|
||||||
} => {
|
} => {
|
||||||
for cmd_node in cmds {
|
for cmd_node in cmds {
|
||||||
cmd_node.walk_tree(f);
|
cmd_node.walk_tree(f);
|
||||||
@@ -272,6 +271,7 @@ bitflags! {
|
|||||||
const FORK_BUILTINS = 0b000010;
|
const FORK_BUILTINS = 0b000010;
|
||||||
const NO_FORK = 0b000100;
|
const NO_FORK = 0b000100;
|
||||||
const ARR_ASSIGN = 0b001000;
|
const ARR_ASSIGN = 0b001000;
|
||||||
|
const PIPE_ERR = 0b010000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -642,8 +642,7 @@ pub enum NdRule {
|
|||||||
argv: Vec<Tk>,
|
argv: Vec<Tk>,
|
||||||
},
|
},
|
||||||
Pipeline {
|
Pipeline {
|
||||||
cmds: Vec<Node>,
|
cmds: Vec<Node>
|
||||||
pipe_err: bool,
|
|
||||||
},
|
},
|
||||||
Conjunction {
|
Conjunction {
|
||||||
elements: Vec<ConjunctNode>,
|
elements: Vec<ConjunctNode>,
|
||||||
@@ -1446,16 +1445,19 @@ impl ParseStream {
|
|||||||
let mut node_tks = vec![];
|
let mut node_tks = vec![];
|
||||||
let mut flags = NdFlags::empty();
|
let mut flags = NdFlags::empty();
|
||||||
|
|
||||||
while let Some(cmd) = self.parse_block(false)? {
|
while let Some(mut cmd) = self.parse_block(false)? {
|
||||||
let is_punctuated = node_is_punctuated(&cmd.tokens);
|
let is_punctuated = node_is_punctuated(&cmd.tokens);
|
||||||
node_tks.append(&mut cmd.tokens.clone());
|
node_tks.append(&mut cmd.tokens.clone());
|
||||||
|
if *self.next_tk_class() == TkRule::ErrPipe {
|
||||||
|
cmd.flags |= NdFlags::PIPE_ERR;
|
||||||
|
}
|
||||||
cmds.push(cmd);
|
cmds.push(cmd);
|
||||||
if *self.next_tk_class() == TkRule::Bg {
|
if *self.next_tk_class() == TkRule::Bg {
|
||||||
let tk = self.next_tk().unwrap();
|
let tk = self.next_tk().unwrap();
|
||||||
node_tks.push(tk.clone());
|
node_tks.push(tk.clone());
|
||||||
flags |= NdFlags::BACKGROUND;
|
flags |= NdFlags::BACKGROUND;
|
||||||
break;
|
break;
|
||||||
} else if *self.next_tk_class() != TkRule::Pipe || is_punctuated {
|
} else if (!matches!(*self.next_tk_class(),TkRule::Pipe | TkRule::ErrPipe)) || is_punctuated {
|
||||||
break;
|
break;
|
||||||
} else if let Some(pipe) = self.next_tk() {
|
} else if let Some(pipe) = self.next_tk() {
|
||||||
node_tks.push(pipe)
|
node_tks.push(pipe)
|
||||||
@@ -1470,7 +1472,6 @@ impl ParseStream {
|
|||||||
// TODO: implement pipe_err support
|
// TODO: implement pipe_err support
|
||||||
class: NdRule::Pipeline {
|
class: NdRule::Pipeline {
|
||||||
cmds,
|
cmds,
|
||||||
pipe_err: false,
|
|
||||||
},
|
},
|
||||||
flags,
|
flags,
|
||||||
redirs: vec![],
|
redirs: vec![],
|
||||||
@@ -1554,6 +1555,7 @@ impl ParseStream {
|
|||||||
match tk.class {
|
match tk.class {
|
||||||
TkRule::EOI
|
TkRule::EOI
|
||||||
| TkRule::Pipe
|
| TkRule::Pipe
|
||||||
|
| TkRule::ErrPipe
|
||||||
| TkRule::And
|
| TkRule::And
|
||||||
| TkRule::BraceGrpEnd
|
| TkRule::BraceGrpEnd
|
||||||
| TkRule::Or
|
| TkRule::Or
|
||||||
@@ -1867,7 +1869,6 @@ where
|
|||||||
}
|
}
|
||||||
NdRule::Pipeline {
|
NdRule::Pipeline {
|
||||||
ref mut cmds,
|
ref mut cmds,
|
||||||
pipe_err: _,
|
|
||||||
} => {
|
} => {
|
||||||
for cmd_node in cmds {
|
for cmd_node in cmds {
|
||||||
check_node(cmd_node, filter, operation);
|
check_node(cmd_node, filter, operation);
|
||||||
|
|||||||
Reference in New Issue
Block a user