Swift Mac应用程序,在不知道路径的情况下运行终端命令(因此它会在$ PATH中的每个路径中查找)?

swift macos swift3 swift2 swift4

627 观看

1回复

659 作者的声誉

我正在尝试从我的Swift Mac应用程序运行终端命令,我希望用户像在终端中一样输入任何命令,而不必指定真实路径。有没有一种方法可以运行命令并使它在$ PATH变量中指定的每个路径中显示?

我可以在指定路径时运行命令,但是我需要它来从系统$ PATH变量中的任何路径中自动查找二进制文件

    let path = "/usr/bin/killall"
    let arguments = ["Dock"]
    let task = Process.launchedProcess(launchPath: path, arguments: arguments)
    task.waitUntilExit()

将来,我想读取.sh文件并运行其中的每一行,因此对于长脚本来说,并非所有二进制文件都位于默认路径中。

谢谢!

作者: Steven.B 的来源 发布者: 2017 年 1 月 7 日

回应 (1)


3

424653 作者的声誉

决定

您可以通过执行命令env

env utility argument ...

例:

let path = "/usr/bin/env"
let arguments = ["ls", "-l", "/"]
let task = Process.launchedProcess(launchPath: path, arguments: arguments)
task.waitUntilExit()

env使用$PATH变量定位给定的实用程序,然后使用给定的参数执行它。它具有其他选项来指定其他搜索路径和其他环境变量。

(这不是Swift的功能,而是macOS和许多其他操作系统的功能。)

从Finder(双击)启动时,它PATH可能与PATH您的Shell环境中的有所不同。如有必要,您可以添加其他目录:

var env = task.environment ?? [:]
if let path = env["PATH"] {
    env["PATH"] = "/usr/local/bin:" + path
} else {
    env["PATH"] = "/usr/local/bin"
}
task.environment = env

excelp和朋友也使用($PATH但仅提供“原始” C接口)查找可执行文件。

作者: Martin R 发布者: 07.01.2017 08:07
32x32