swiftshell命令返回空结果

swiftshell命令返回空结果,swift,xcode,shell,process,Swift,Xcode,Shell,Process,我已经在我的Mac上安装了。 我正在尝试使用以下代码从Swift执行chrome cli命令: import Foundation func shell(_ command: String) -> String { let task = Process() let pipe = Pipe() task.standardOutput = pipe task.arguments = ["-c", command] task

我已经在我的Mac上安装了。 我正在尝试使用以下代码从Swift执行chrome cli命令:

    import Foundation

func shell(_ command: String) -> String {
    let task = Process()
    let pipe = Pipe()

    task.standardOutput = pipe
    task.arguments = ["-c", command]
    task.launchPath = "/bin/bash"
    task.launch()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: .utf8)!

    return output
}

// Example 1: 
let example1 = shell("/usr/local/bin/chrome-cli --help") //returns expected result
let example2 = shell("/usr/local/bin/chrome-cli list tabs") // return ""
在这里,示例1使用单参数调用,并且运行良好,即它打印相同的结果,就像我们在终端中执行命令一样

但例如2,我们有多个参数,它总是返回空结果。而终端上的同一命令打印当前打开的标签列表

我认为该过程不会等待命令返回结果,因为在终端应用程序中列出选项卡需要1-2秒。还是其他问题?


请帮忙。谢谢。

由于chrome cli 1.6.0于2018年发布,但具有新功能的新chrome版本定期出现,我建议通过
SBApplication
直接使用chrome来访问任何需要的信息,例如:

import ScriptingBridge

@objc protocol ChromeTab {
    @objc optional var id: Int {get}
    @objc optional var title: String {get}
}
extension SBObject: ChromeTab {}

@objc protocol ChromeWindow {
    @objc optional var tabs: [ChromeTab] {get}
}
extension SBObject: ChromeWindow {}

@objc protocol ChromeApplication {
    @objc optional var windows: [ChromeWindow] {get}
}
extension SBApplication : ChromeApplication {}

// Print all tabs
if let chrome = SBApplication(bundleIdentifier: "com.google.Chrome") as ChromeApplication? {
    if let window = chrome.windows?.first {
        window.tabs?.forEach {
            if let id = $0.id, let title = $0.title {
                print("[\(id)] -", title)
            }
        }
    }
}

有关Chrome扩展的更多信息,请查看

,它可能确实是一个异步问题:否则,请检查
任务。errorOutput
,检查它是否不在错误中(对error.errorOutput属性执行与标准相同的操作。Process不存在errorOutput属性。我只看到了
task.standardError
,并在其中附加了一个管道,该管道还返回空结果。这就是我的意思,抱歉。我没有检查doc.Loin以进行异步管理。感谢您的参考。我已经对此进行了研究。我进行了测试,并且通过将其用作脚本,它可以正常工作。这似乎是很酷的选择,但我打开了两个窗口,windows将返回0元素。我需要一些权限吗?此外,我还需要从swift将一个选定的选项卡放到前面。如果你能帮上忙,那将非常棒。我还检查了参考文档,似乎很有帮助ful.@ZahidUsmanCheema在macos Catalina上,系统要求将我的应用程序的访问权限授予Chrome,此设置在“系统首选项”>“安全与隐私”>“自动化”中,在我访问所有数据之后。这可能是您的用户帐户的权限,因为您的脚本和我的工作都正常。@ZahidUsmanCheema尝试添加
nsappleeventsugeDescription
在您的Info.plist(`)中我做了。仍然没有。我应该尝试打开或关闭沙盒模式吗?这很有效:“在向Info.plist添加NsappleEventsSageDescription并在强化运行时启用事件后,现在就可以了。谢谢。”