【问题标题】:How to run a shell script from cocoa application using Swift?如何使用 Swift 从可可应用程序运行 shell 脚本?
【发布时间】:2017-03-06 09:58:55
【问题描述】:

如何使用 Swift 从可可应用程序运行 shell 脚本?

我有一个 shell 脚本 file.sh,我想在我的 cocoa 应用程序中运行它。如何使用 Swift 做到这一点?

任何帮助表示赞赏! :)

【问题讨论】:

    标签: swift shell cocoa terminal


    【解决方案1】:

    前 Swift 3

    您可以为此使用NSTask (API reference here)。

    NSTask 需要(除其他外)launchPath,它指向您的脚本。它还可以采用arguments 的数组,当您准备好启动任务时,您可以调用launch()

    所以...类似于:

    var task = NSTask()
    task.launchPath = "path to your script"
    task.launch()
    

    发布 Swift 3

    正如@teo-sartory 在他下面的评论中指出的NSTask 现在是Process,记录在案的here

    命名和调用方式也发生了一些变化,这里有一个如何使用Process调用ls的示例

    let process = Process()
    process.executableURL = URL(fileURLWithPath: "/bin/ls")
    try? process.run()
    

    如果您希望更好地访问/更好地控制调用的输出,可以附加Pipe(记录在here)。

    这里有一个简单的例子来说明如何使用它:

    let process = Process()
    process.executableURL = URL(fileURLWithPath: "/bin/ls")
    
    // attach pipe to std out, you can also attach to std err and std in
    let outputPipe = Pipe()
    process.standardOutput = outputPipe
    
    // away we go!
    try? process.run()
    
    //read contents as data and convert to a string
    let output = outputPipe.fileHandleForReading.readDataToEndOfFile()
    let str = String(decoding: output, as: UTF8.self)
    print(str)
    

    您想了解更多

    你可以看看:

    希望对你有所帮助。

    【讨论】:

    • NSTask 现在是 Process()
    【解决方案2】:

    我在网上找到了这个功能:

    @discardableResult
    private func shell(_ args: String) -> String {
        var outstr = ""
        let task = Process()
        task.launchPath = "/bin/sh"
        task.arguments = ["-c", args]
        let pipe = Pipe()
        task.standardOutput = pipe
        task.launch()
        let data = pipe.fileHandleForReading.readDataToEndOfFile()
        if let output = String(data: data, encoding: .utf8) {
            outstr = output as String
        }
        task.waitUntilExit()
        return outstr
    }
    

    来电:

    shell("/pathToSh/file.sh")
    

    【讨论】:

    • 错了。您的 func 的完整命令是:/bin/sh -c sh /pathToSh/file.sh 这显然不起作用..
    • @AlessandroOrnano 刚刚用shell("open /Folder/") 重新测试过,效果很好。也许你应该检查一下-c 做了什么...stackoverflow.com/questions/3985193/what-is-bin-sh-c
    • 即使你的第二个例子是错误的,open 从外壳打开文件,不要更改目录。你的方法启动bash -c,这意味着它将启动bash并在-c之后执行命令,所以它就像bash -c bash file.sh一样,它不起作用。
    • 我从来没有说过我想改变目录,我想打开它,它确实做到了。所以在那张纸条上,它有效。现在,命令sh 是用来运行脚本的……不过你的版本也可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-22
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    • 2017-11-15
    相关资源
    最近更新 更多