在 C 程序中执行 bash 以导出环境变量

execute a bash in C program to export environment variable

本文关键字:环境变量 bash 执行 程序      更新时间:2023-10-16

你好,我正在尝试执行一个包含导出的 bash 文件,并将其导出到我的 Cpp 程序中。

目标是在我的一个程序开始时自动设置我需要的环境变量。

我似乎无法让它工作。

我的 myExport.sh:

export LOG4CXXCONFFILE="/home/me/workspace/Log/log4cxx.properties"

我的代码是:

#include <stdlib.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    qDebug() << system(" bash myExport.sh");
    try
    {
        QString myFile = getenv("LOG4CXXCONFFILE");
        qDebug() << "my env variable directory path:"<< myFile;
    }
    catch(Exception&)
    {
        result = "EXIT_FAILURE";
    }
return a.exec();
}

我的调试显示它有效,但我无法获得 env. 变量:


0 我的环境变量目录路径:"

我想这可能是因为脚本只在它运行的子壳中设置环境,所以我尝试了:

qDebug() << system(". ./myExport.sh") ;

这给了我同样的答案。

所以我也尝试了:

qDebug() << system("source myExport.sh");

答案是:

sh: 1: source: not found
32512 
my env variable directory path: ""

我试过:

qDebug() << system("bash source myExport.sh");
bash: source: Aucun fichier ou dossier de ce type   (no file or directory of this type, don't know why this is the only error in french)
32512 
my env variable directory path: ""

我没主意了,有人知道为什么它不起作用吗?

我不能说我完全理解你的问题,但在我看来,你正在尝试通过bash脚本更新你的进程的环境。这根本不可能。子进程永远不能修改其父进程的环境。

而且你的应用程序的进程不是bash的(它是你的应用程序),所以它不能"获取"shell脚本。如果您有环境设置bash脚本,则有以下选项:

  1. 在启动应用程序之前运行 env 安装程序脚本(可能通过包装器bash脚本启动应用程序)。

  2. bash作为子进程执行,让它获取脚本并从中检索相关信息(例如,将环境写入bash脚本中的标准输出,并在C++中捕获其标准输出)。为此,您可能需要查看 QProcess ,尤其是 QProcess::setReadChannel() .