嗨,我想编写一个包含一些我日常使用的脚本按钮的应用程序。 我想单击一个按钮,然后单击“终端”以运行一个(或多个)脚本运行,例如:
let scripts = [
"cd ~/Documents/Websites/someApp/",
"ng serve --port 4300 -o"
]
performInTerminal(scripts)
我知道如何... 打开终端:
private func openTerminal(){
let url = NSURL(fileURLWithPath: "/System/Applications/Utilities/Terminal.app", isDirectory: true) as URL
let path = "/bin"
let configuration = NSWorkspace.OpenConfiguration()
configuration.arguments = [path]
NSWorkspace.shared.openApplication(at: url, configuration: configuration, completionHandler: nil)
}
以及如何... 执行脚本:
不幸的是,这似乎不适用于ls
以外的任何事物,并且它与终端窗口没有任何连接,这很有意义。
private func performScript(_ args: String...){
let process = Process()
process.launchPath = "/usr/bin/env"
process.arguments = args
process.launch()
process.waitUntilExit()
}
关于如何合并这两个的任何想法?
更新
我现在使用Apple Script添加了该功能:
private func performInTerminal(_ scripts:[String]){
let concatScript = scripts.joined(separator: "; ")
let source = """
tell application "Terminal"
if not (exists window 1) then reopen
activate
do script "\(concatScript)"
end tell
"""
let appleScript = NSAppleScript(source: source)
var possibleError: NSDictionary?
appleScript?.executeAndReturnError(&possibleError)
if let error = possibleError {
for key in error.allKeys{
if let key = key as? String{
print("\(key): \(error.value(forKey: key)!)")
}
}
}
}
现在的问题是应享权利:
通过AppName.entitlements
中的以下命令,它可以工作,但是每次都请求权限:
<key>com.apple.security.temporary-exception.apple-events</key>
<array>
<string>com.apple.Terminal</string>
</array>
通过以下操作,我得到-10004: Terminal got an error: A privilege violation occurred.
:
<key>com.apple.security.scripting-targets</key>
<dict>
<key>com.apple.Terminal</key>
<array>
<string>*</string>
</array>
</dict>