 
     @discardableResult
     public func execute() throws -> String {
-        var commands = [ShellCommand]()
-        var command: ShellCommand? = self
-        repeat {
-            commands.append(command!)
-            command = command!.parentCommand
-        } while command != nil
-
-        for command in commands {
-            command.process.launch()
-        }
+        self.startExecution()
 
         self.process.waitUntilExit()
 

        return self.command.joined(separator: " ")
    }
}
#endif

        }
    }

    deinit {
        self.process.terminate()
    }

    public convenience init(_ command: [String], captureOutput: Bool = true) {
        self.init(command, parentCommand: nil, captureOutput: captureOutput)
    }
