繁体   English   中英

从 C++ 程序中获取 bash $PATH

[英]Get bash $PATH from C++ program

在终端应用程序中,我的$PATH是:

/usr/local/opt/python/libexec/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin

如果用户使用 Dock 启动我的 C++ 应用程序,它的$PATH是:

/usr/bin:/bin:/usr/sbin:/sbin

我希望我的应用程序始终具有与终端 (bash) 相同的$PATH 有没有简单的方法来实现这一目标?

我现在知道的唯一方法是在磁盘上创建一个类似于echo $PATH的 bash 脚本,使用bash -l命令从我的 C++ 程序启动它,读取输出并相应地更新我的进程的PATH变量。

而且,我不想以任何方式更改用户系统的配置。 这应该可以在不需要用户执行任何额外操作的情况下工作,并且不会以任何方式影响用户的系统。

如果您不喜欢调用 bash 的解决方案,这里有一个存根,用于对调用 shell 进行更多控制,并可能测试用户默认 shell 是否不是在 c++ 程序中的所有bash

setenv("PATH", "/MyCustomPath:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin", 1);

读取 bash 的路径:

std::string exec(const char* cmd) {
    char buffer[128];
    std::string result = "";
    FILE* pipe = popen(cmd, "r");
    if (!pipe) throw std::runtime_error("popen() failed!");
    try {
        while (fgets(buffer, sizeof buffer, pipe) != NULL) {
            result += buffer;
        }
    } catch (...) {
        pclose(pipe);
        throw;
    }
    pclose(pipe);
    return result;
}

setenv("PATH", exec("bash -l -c 'echo -n $PATH'").c_str(), 1);

在许多情况下,从 Shell/Explorer/Dock/etc 启动应用程序会获得与命令行/终端/bash 不同的环境,因为 Shell/Explorer/Dock 是由 GUI 登录过程而不是命令行/终端/Bash 调用的。

当您运行终端/Bash 时,会运行.bashrc / .bash_profile等脚本,这些脚本通常被配置为将内容添加到 PATH 环境变量中以方便命令行。

从问题中不清楚您的应用程序是由其他用户使用还是仅由您自己使用:

  1. 您能否将“Dock 图标”更改为指向在启动 C++ 应用程序之前设置 PATH 环境变量的 Shell 脚本?

  2. 如果失败,如果它只适合你,你可以破解你的系统范围的 bashrc: sudo $EDITOR /etc/bashrc ..但不推荐这样做

  3. 如果您的 C++ 应用程序依赖于 $PATH 中的某些内容,您可以围绕它进行编码吗? 例如,使用您需要运行的任何应用程序的绝对路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM