从Mac App打开终端窗口并执行脚本

时间:2020-07-03 08:06:36

标签: swift bash macos shell terminal

嗨,我想编写一个包含一些我日常使用的脚本按钮的应用程序。 我想单击一个按钮,然后单击“终端”以运行一个(或多个)脚本运行,例如:

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>

0 个答案:

没有答案