 
 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()

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

    deinit {


    public func terminate() {
        self.process.terminate()
        self.removeFromCommandsToKill()
    }

    public func waitUntilExit() {
        self.process.waitUntilExit()
    }

    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() {
