我正在创建一个macOS应用程序,该应用程序允许用户运行终端命令。我能够运行一个命令,但据我所知,它是从我的应用程序中的一个目录运行的。运行pwd将返回/Users/<me>/Library/Containers/<My app's bundle identifier>/Data。
如何选择命令从哪个目录运行?
我也在寻找一种让cd工作的方法,但是如果我可以选择从哪个目录运行终端命令,我可以手动处理cd。
下面是我目前用于运行终端命令的代码:
func shell(_ command: String) -> String {
let task = Process()
let pipe = Pipe()
task.standardOutput = pipe
task.arguments = ["-c", command]
task.launchPath = "/bin/zsh"
task.launch()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
let output = String(data: data, encoding: .utf8)!
return output
}我在大苏尔使用Xcode 12。
谢谢!
发布于 2020-08-23 23:44:45
在currentDirectoryPath上有一个不推荐的属性Process。
假设您不想使用不推荐的属性,在将其文档头转到FileManager并查看用于管理当前目录的is条款及其含义之后。
或者使用cd,就像您已经考虑过的那样,- you启动了一个shell (zsh),其中包含一个shell命令行作为参数。命令行可以包含由分号分隔的多个命令,因此可以将cd添加到command值中。
后一种方法避免更改当前进程的当前目录。
HTH
发布于 2021-07-26 15:22:01
要添加CRD的答案,如果使用cd方法,还可以考虑使用&&分隔命令,等待前面的命令成功完成,然后再转到依赖于它的下一个命令。
尝试您希望在终端中运行的命令,看看它是否按照预期完成。
例:/bin/bash -c "cd /source/code/ && git pull && swift build"
如果一切按预期工作,您可以继续在您的快速代码中使用它,如下所示:
shell("cd /source/code/ && git pull && swift build")
在不推荐的主题上,您可能希望用executableURL替换launchPath,用跑()替换跑()()
使用更新代码的示例实现:
@discardableResult
func shell(_ args: String...) -> Int32 {
let task = Foundation.Process()
task.executableURL = URL(fileURLWithPath: "/bin/bash")
task.arguments = ["-c"]
task.arguments = task.arguments! + args
//Set environment variables
var environment = ProcessInfo.processInfo.environment
environment["PATH"]="/usr/bin/swift"
//environment["CREDENTIALS"] = "/path/to/credentials"
task.environment = environment
let outputPipe = Pipe()
let errorPipe = Pipe()
task.standardOutput = outputPipe
task.standardError = errorPipe
do {
try task.run()
} catch {
// handle errors
print("Error: \(error.localizedDescription)")
}
task.waitUntilExit()
let outputData = outputPipe.fileHandleForReading.readDataToEndOfFile()
let errorData = errorPipe.fileHandleForReading.readDataToEndOfFile()
let output = String(decoding: outputData, as: UTF8.self)
let error = String(decoding: errorData, as: UTF8.self)
//Log or return output as desired
print(output)
print("Ran into error while running: \(error)")
return task.terminationStatus
}https://stackoverflow.com/questions/63552825
复制相似问题