 
     public func terminate() {
         self.process.terminate()
+        self.removeFromCommandsToKill()
     }
 
     public func waitUntilExit() {
         self.process.waitUntilExit()
     }
 
-    public func pipe(to: String) -> ShellCommand {
-        return ShellCommand(to, parentCommand: self)
+    public func pipe(to: String, captureOutput: Bool = true) -> ShellCommand {
+        return ShellCommand(to, parentCommand: self, captureOutput: captureOutput)
     }
 
     public var description: String {
         return self.command.joined(separator: " ")
     }
 }
+
+private var commandsToKill = [ShellCommand]()
 
 private extension ShellCommand {
     func startExecution() {

        else if captureOutput {
            self.process.standardOutput = Pipe()
        }
    }

    deinit {


public final class ShellCommand: CustomStringConvertible {
    private let command: [String]

    static let once: Void = {
        signal(SIGINT, { _ in
            for command in commandsToKill {
                command.terminate()
            }
        })
    }()

    #if os(Linux)
        fileprivate let process = Task()
