如何从我的 mac 应用程序中访问终端的 $PATH 变量,它似乎使用不同的 $PATH

2024-01-06

我正在尝试制作一个 mac 应用程序,用户可以像在 mac 终端中一样输入命令,我得到了大部分工作,但是我发现从 finder 或 xcode 运行的应用程序的 $PATH 变量是不同的比终端使用的 $PATH 变量。

我可以运行命令,还找到了一种将预定义路径添加到应用程序的 $PATH 变量的方法,但我需要一种方法来自动读取终端的 $PATH 变量并将其复制到应用程序的 $PATH 变量。这应该是自动化的,因为用户的变量内部会有不同的路径。

我还发现,当我使用“open appname.app”从终端运行应用程序时,使用了正确的 $PATH 变量(与终端使用的变量相同)

到目前为止,这是我的代码:

    let task = Process()
    var env = ProcessInfo.processInfo.environment
    var path = env["PATH"]! as String
    path = "/usr/local/bin:" + path
    env["PATH"] = path
    task.environment = env
    task.launchPath = "/usr/bin/env"
    task.arguments = ["echo","$PATH"]
    let pipe = Pipe()
    task.standardOutput = pipe
    task.standardError = pipe
    task.launch()
    task.waitUntilExit()
    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
    print(output)

这会将“/usr/local/bin”添加到应用程序的 $PATH,但我需要一种方法来从终端的 $PATH 复制值。

Thanks!


添加 bash shell 路径

默认的 shell 路径可以在以下位置找到/etc/paths and /etc/path.d/。读取 shell 路径的一种方法是使用path_helper命令。扩展上面的代码示例并使用 bash 作为 shell:

let taskShell = Process()
var envShell = ProcessInfo.processInfo.environment
taskShell.launchPath = "/usr/bin/env"
taskShell.arguments = ["/bin/bash","-c","eval $(/usr/libexec/path_helper -s) ; echo $PATH"]
let pipeShell = Pipe()
taskShell.standardOutput = pipeShell
taskShell.standardError = pipeShell
taskShell.launch()
taskShell.waitUntilExit()
let dataShell = pipeShell.fileHandleForReading.readDataToEndOfFile()
var outputShell: String = NSString(data: dataShell, encoding: String.Encoding.utf8.rawValue) as! String
outputShell = outputShell.replacingOccurrences(of: "\n", with: "", options: .literal, range: nil)
print(outputShell)

let task = Process()
var env = ProcessInfo.processInfo.environment
var path = env["PATH"]! as String
path = outputShell + ":" + path
env["PATH"] = path
task.environment = env
task.launchPath = "/usr/bin/env"
task.arguments = ["/bin/bash", "-c", "echo $PATH"]
let pipe = Pipe()
task.standardOutput = pipe
task.standardError = pipe
task.launch()
task.waitUntilExit()
let data = pipe.fileHandleForReading.readDataToEndOfFile()
var output: String = NSString(data: data, encoding: String.Encoding.utf8.rawValue) as! String
output = output.replacingOccurrences(of: "\n", with: "", options: .literal, range: nil)
print(output)

Note:

  1. 此代码示例以非交互模式调用 shell。这意味着它不会执行任何用户特定的配置文件;例如/Users/*userid*/.bash_profile.
  2. 路径可以在中多次列出PATH环境变量。将从左到右遍历它们。

参考

OS X 的应用程序和 shell 路径上有几个线程,它们提供了更多上下文如何在 OS X Mavericks 上设置系统范围的环境变量 https://apple.stackexchange.com/questions/107787/how-to-set-system-wide-environment-variables-on-os-x-mavericks and 在 Mavericks 中设置系统范围的路径环境变量 https://apple.stackexchange.com/questions/106355/setting-the-system-wide-path-environment-variable-in-mavericks

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从我的 mac 应用程序中访问终端的 $PATH 变量,它似乎使用不同的 $PATH 的相关文章

随机推荐