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