From 4035d7d59a2ed774c748f3a144b9c9778c4c059d Mon Sep 17 00:00:00 2001 From: Michael Aaron Murphy <mmstickman@gmail.com> Date: Tue, 11 Jul 2017 03:23:10 -0400 Subject: [PATCH] Ensure Termination of Pipes & Jobs (#381) --- src/builtins/job_control.rs | 5 ++--- src/parser/quotes.rs | 20 ++++++++++++++------ src/shell/pipe.rs | 2 +- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/builtins/job_control.rs b/src/builtins/job_control.rs index b5190a22..71c9950c 100644 --- a/src/builtins/job_control.rs +++ b/src/builtins/job_control.rs @@ -75,9 +75,8 @@ pub fn jobs(shell: &mut Shell) { let stderr = stderr(); let mut stderr = stderr.lock(); for (id, process) in shell.background.lock().unwrap().iter().enumerate() { - match process.state { - ProcessState::Empty => (), - _ => { let _ = writeln!(stderr, "[{}] {} {}\t{}", id, process.pid, process.state, process.name); } + if process.state != ProcessState::Empty { + let _ = writeln!(stderr, "[{}] {} {}\t{}", id, process.pid, process.state, process.name); } } } diff --git a/src/parser/quotes.rs b/src/parser/quotes.rs index 8c41e8b3..9c777a73 100644 --- a/src/parser/quotes.rs +++ b/src/parser/quotes.rs @@ -39,13 +39,21 @@ impl QuoteTerminator { self.read += 1; self.buffer.push('\n'); false - } else if self.buffer.bytes().last() == Some(b'\\') { - let _ = self.buffer.pop(); - self.read -= 1; - self.flags |= TRIM; - false } else { - true + match self.buffer.bytes().last() { + Some(b'\\') => { + let _ = self.buffer.pop(); + self.read -= 1; + self.flags |= TRIM; + false + }, + Some(b'|') | Some(b'&') => { + // self.read -= 1; + // self.flags |= TRIM; + false + } + _ => true + } } } diff --git a/src/shell/pipe.rs b/src/shell/pipe.rs index 936181ef..99c8579c 100644 --- a/src/shell/pipe.rs +++ b/src/shell/pipe.rs @@ -359,7 +359,7 @@ fn wait ( foreground: bool ) -> i32 { let end = children.len() - 1; - for entry in children.drain(..end).zip(commands.drain(..)) { + for entry in children.drain(..end).zip(commands.drain(..end)) { // It is important that `cmd` gets dropped at the end of this // block in order to write EOF to the pipes that it owns. if let (Some(child), cmd) = entry { -- GitLab