0

我正在尝试从我的 swift mac 应用程序运行终端命令,我希望用户像在终端中一样输入任何命令,而无需指定真实路径。有没有办法运行命令并使其查看 $PATH 变量中指定的每个路径?

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

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

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

谢谢!

4

1 回答 1

5

您可以通过以下方式执行命令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

execlp$PATH和朋友也使用但仅提供“原始” C 接口来定位可执行文件。

于 2017-01-07T20:07:57.657 回答