Last active
October 18, 2021 05:43
-
-
Save profburke/c6a39a034077584f8dbafe591bcb526d to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
public enum ExecutionError: Error { | |
case SomethingHappened | |
} | |
func execute(command: String, args: [String]? = nil, input: String? = nil) throws -> String { | |
let task = Process() | |
var inpipe: Pipe? | |
task.launchPath = command | |
if args != nil { | |
task.arguments = args | |
} | |
if input != nil { | |
inpipe = Pipe() | |
task.standardInput = inpipe | |
} | |
let outpipe = Pipe() | |
task.standardOutput = outpipe | |
task.launch() | |
if let inpipe = inpipe, | |
let input = input { | |
let bytes: [UInt8] = Array(input.utf8) | |
let fh = inpipe.fileHandleForWriting | |
fh.write(Data(bytes: bytes)) | |
fh.closeFile() | |
} | |
let output = outpipe.fileHandleForReading.readDataToEndOfFile().base64EncodedString() | |
return output | |
} | |
// NOTE: this does not return what you'd expect. The returned string is Base64-encoded data | |
// (because that's what I needed for a particular use case). | |
// So if you want to do something "normal", e.g. | |
// | |
// let result = execute(command: "/bin/ls", args: ["-a", "-l"]) | |
// | |
// You'll then need to decode result as follows: | |
// | |
// let listing = String(data: Data(base64Encoded: res!)!, encoding: .utf8)! | |
// | |
// Needs some improvements. In particular, launch throws an error if the launchPath does | |
// not point to a valid executable. Do we want to catch it and try and do something | |
// like search a path? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment