NSUserUnixTask 悄悄忽略脚本
NSUserUnixTask ignores script quietly
我正在使用 Xcode 9 在 macOS High Sierra 上的 Swift 4 中编写一个沙盒应用程序。我的应用程序有一个 shell 脚本文件(例如,myscript
) 安装时复制到 Bundle.main.resourceURL
目录。我想 运行 这个 shell 脚本使用 NSUserUnixTask
如下:
if let scriptUrl = URL(string: "myscript", relativeTo: Bundle.main.resourceURL) {
do {
let task = try NSUserUnixTask(url: scriptUrl)
task.execute(withArguments: [ "hello" ])
debugPrint("OK")
} catch let error {
debugPrint(error)
}
} else {
debugPrint("Script not found")
}
// output: "OK"
这不会给出任何错误消息并且 "OK" 会正确显示。但是 myscript
脚本似乎完全被忽略了。当我 运行 myscript
改为 Terminal
时,它 运行 是预期的。
测试 myscript
文件如下所示:
#!/bin/sh
/usr/bin/osascript -e "tell app \"System Events\" to display dialog \"Message: \""
(这只是一个测试脚本;真正的脚本调用 emacsclient
。)shell 脚本文件设置为可执行(权限 755)。不仅这个 shell 脚本而且任何其他 shell 脚本似乎都被忽略了。例如,如果将第二行替换为 /usr/bin/printf "\a"
,则不会发出蜂鸣声。我尝试了许多其他 shell 脚本,但似乎没有任何效果。
我该如何解决这个问题?
编辑:
我仓促了。 class 文档说 "If the application is sandboxed, then the script must be in the applicationScriptsDirectory
folder." 现在我想知道如何在安装时复制脚本文件。
编辑 2:
我手动复制了myscript
到~/Library/Applications Scripts/com.mydomain.myApp/
然后把上面第一行Swift代码(if let scriptUrl ...
)改成了
let scriptFolderUrl = try! FileManager.default.url(for: .applicationScriptsDirectory,
in: .userDomainMask, appropriateFor: nil, create: true)
if let scriptUrl = URL(string: "myscript", relativeTo: scriptFolderURL) {
脚本运行s。现在我需要弄清楚如何在第一次安装或 运行 应用程序时将脚本复制到脚本文件夹。
pkamp 请求正确答案。 :)
正如 class document says, the script must be in the applicationScriptsDirectory
folder. This folder is not writable by a sandboxed application, as vadian 指出的那样。必须手动将脚本 (myscript
) 复制到 applicationScriptDirectory
文件夹(例如 ~/Library/Applications Scripts/com.mydomain.myApp/
)。
完成后,将第一行更改为以下内容:
// --------------------------------------------------------
let scriptFolderUrl = try! FileManager.default.url(for: .applicationScriptsDirectory,
in: .userDomainMask, appropriateFor: nil, create: true)
if let scriptUrl = URL(string: "myscript", relativeTo: scriptFolderURL) {
// --------------------------------------------------------
// same below
do {
let task = try NSUserUnixTask(url: scriptUrl)
task.execute(withArguments: [ "hello" ])
debugPrint("OK")
} catch let error {
debugPrint(error)
}
} else {
debugPrint("Script not found")
}
第一行我受益于 this link。
我正在使用 Xcode 9 在 macOS High Sierra 上的 Swift 4 中编写一个沙盒应用程序。我的应用程序有一个 shell 脚本文件(例如,myscript
) 安装时复制到 Bundle.main.resourceURL
目录。我想 运行 这个 shell 脚本使用 NSUserUnixTask
如下:
if let scriptUrl = URL(string: "myscript", relativeTo: Bundle.main.resourceURL) {
do {
let task = try NSUserUnixTask(url: scriptUrl)
task.execute(withArguments: [ "hello" ])
debugPrint("OK")
} catch let error {
debugPrint(error)
}
} else {
debugPrint("Script not found")
}
// output: "OK"
这不会给出任何错误消息并且 "OK" 会正确显示。但是 myscript
脚本似乎完全被忽略了。当我 运行 myscript
改为 Terminal
时,它 运行 是预期的。
测试 myscript
文件如下所示:
#!/bin/sh
/usr/bin/osascript -e "tell app \"System Events\" to display dialog \"Message: \""
(这只是一个测试脚本;真正的脚本调用 emacsclient
。)shell 脚本文件设置为可执行(权限 755)。不仅这个 shell 脚本而且任何其他 shell 脚本似乎都被忽略了。例如,如果将第二行替换为 /usr/bin/printf "\a"
,则不会发出蜂鸣声。我尝试了许多其他 shell 脚本,但似乎没有任何效果。
我该如何解决这个问题?
编辑:
我仓促了。 class 文档说 "If the application is sandboxed, then the script must be in the applicationScriptsDirectory
folder." 现在我想知道如何在安装时复制脚本文件。
编辑 2:
我手动复制了myscript
到~/Library/Applications Scripts/com.mydomain.myApp/
然后把上面第一行Swift代码(if let scriptUrl ...
)改成了
let scriptFolderUrl = try! FileManager.default.url(for: .applicationScriptsDirectory,
in: .userDomainMask, appropriateFor: nil, create: true)
if let scriptUrl = URL(string: "myscript", relativeTo: scriptFolderURL) {
脚本运行s。现在我需要弄清楚如何在第一次安装或 运行 应用程序时将脚本复制到脚本文件夹。
pkamp 请求正确答案。 :)
正如 class document says, the script must be in the applicationScriptsDirectory
folder. This folder is not writable by a sandboxed application, as vadian 指出的那样。必须手动将脚本 (myscript
) 复制到 applicationScriptDirectory
文件夹(例如 ~/Library/Applications Scripts/com.mydomain.myApp/
)。
完成后,将第一行更改为以下内容:
// --------------------------------------------------------
let scriptFolderUrl = try! FileManager.default.url(for: .applicationScriptsDirectory,
in: .userDomainMask, appropriateFor: nil, create: true)
if let scriptUrl = URL(string: "myscript", relativeTo: scriptFolderURL) {
// --------------------------------------------------------
// same below
do {
let task = try NSUserUnixTask(url: scriptUrl)
task.execute(withArguments: [ "hello" ])
debugPrint("OK")
} catch let error {
debugPrint(error)
}
} else {
debugPrint("Script not found")
}
第一行我受益于 this link。