使用swift执行位于MacOS应用程序包中的shell脚本



我正试图了解是否可以在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()
}

相关内容

  • 没有找到相关文章

最新更新