【问题标题】:How do I run shell command in swift?如何快速运行 shell 命令?
【发布时间】:2018-01-22 06:59:28
【问题描述】:

我正在做一个 macOS 应用程序,试图在子进程中运行 shell 命令。如果我不将launchPath设置为/usr/bin/env,我会收到错误Couldn't posix_spawn: error 13,为什么会这样?如何在其他路径中运行 shell 命令?

class Helper {
    static func shell(launchPath path: String, arguments args: [String]) -> String {
        let task = Process()
        task.launchPath = path
        task.arguments = args

        let pipe = Pipe()
        task.standardOutput = pipe
        task.standardError = pipe
        task.launch()

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

        return(output!)
    }
}

let res = Helper.shell(launchPath: "/Users/myUserName", arguments: ["ls"]) //error

【问题讨论】:

    标签: swift macos


    【解决方案1】:

    可以访问像/Users/myName/myWorkspace这样的路径, 但您首先要禁用应用沙箱:

    如果你想在自定义目录中运行ls,你可以试试这个例子:

    let res = Helper.shell(launchPath: "/bin/ls", arguments: ["/Users/myUserName/myworkspace"])
    print("*** ls ***:\n\(res)")
    

    在我的情况下,我有以下输出:

    *** ls ***:
    file1.txt
    file2.txt
    file3.txt
    

    【讨论】:

    • 我不清楚launchPath。我可以在/Users/myName/myWorkspace 等其他路径下运行命令吗
    • 当然。检查编辑,添加了一些有用的信息
    • 如果我想在特定路径下运行一些cli程序,例如npm ls/Users/myUserName/myworkspace下,那我应该把路径放在哪里?
    • 我认为最好的办法是拥有一个 shell 脚本,您可以在其中轻松添加所有命令,然后使用 Process 启动脚本即可。
    • 好的,在这种情况下,我可以将我的 sh 文件放在我的应用程序的某个位置吗?
    【解决方案2】:

    launch() 函数已弃用,使用 run()

    if #available(macOS 10.13, *) {
      try? task.run()
    } else {
      task.launch()
    }
    

    或使用swift-commands

    import Commands
    
    Commands.Bash.run("ls")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多