我正试图了解是否可以在swift中执行位于我的应用程序包中的shell脚本。这是一个禁用了沙盒的Mac应用程序。
这就是我获取url的方式,它正在工作:
guard let saveScriptURL = Bundle.main.url(forResource: "scripts/save", withExtension: "sh") else {
VsLogger.logDebug("***", "Unable to get save.sh file")
return false
}
它返回这个
/Users/me/Library/Developer/Xcode/DerivedData/appName-fcowyecjzsqnhrchpnwrtthxzpye/Build/Products/Debug/appName.app/Contents/Resources/scripts/save.sh
那么这就是我运行它的代码。
func shell(_ scriptURL: URL) throws {
let task = Process()
let pipe = Pipe()
task.standardOutput = pipe
task.standardError = pipe
task.executableURL = scriptURL
try task.run()
}
但我得到了错误:
Error Domain=NSCocoaErrorDomain Code=4 "The file “save.sh” doesn’t exist." UserInfo={NSFilePath=/Users/me/Library/Developer/Xcode/DerivedData/appName-fcowyecjzsqnhrchpnwrtthxzpye/Build/Products/Debug/appName.app/Contents/Resources/scripts/save.sh}
任何建议都将不胜感激。
您的代码中有一些问题需要修复。
首先,您错误地使用了Process,属性executableURL
用于可执行文件,在这种情况下是shell,您希望用于运行脚本,因此对于zsh,它应该设置为
task.executableURL = URL(fileURLWithPath: "/bin/zsh")
其次,经过一些尝试和错误,我们似乎无法直接执行脚本,我想这是因为即使我们使用chmod将脚本设置为可执行脚本,当脚本复制到捆绑包时,这也会丢失。因此,脚本需要作为";源保存.sh";
为了设置要运行的脚本,我们使用arguments
属性
task.arguments = ["-c", "source (scriptURL.path"]
因此,您的shell
函数一起成为
func shell(_ scriptURL: URL) throws {
let task = Process()
let pipe = Pipe()
task.standardOutput = pipe
task.standardError = pipe
task.executableURL = URL(fileURLWithPath: "/bin/zsh")
task.arguments = ["-c", "source (scriptURL.path)"]
try task.run()
}