从C+;永久设置环境变量+;退出后的程序 我正在编写一个BASH脚本,它运行C++程序多次。我使用 GEDEVE()/和 PuthVE()/Cuffe>来创建、获取和更新C++程序中的环境变量。在C++程序结束后,BASH脚本需要捕获这些变量并执行一些基本逻辑。问题是,当C++程序退出时,环境变量消失。有没有办法在程序终止后永久存储这些变量,以便bash脚本可以使用它们?如果不是,在BASH脚本和C++程序之间共享变量的最佳方法是什么?我能想到的唯一解决方案是将输出写入文件。我不想在控制台中打印此数据。非常感谢您的帮助。

从C+;永久设置环境变量+;退出后的程序 我正在编写一个BASH脚本,它运行C++程序多次。我使用 GEDEVE()/和 PuthVE()/Cuffe>来创建、获取和更新C++程序中的环境变量。在C++程序结束后,BASH脚本需要捕获这些变量并执行一些基本逻辑。问题是,当C++程序退出时,环境变量消失。有没有办法在程序终止后永久存储这些变量,以便bash脚本可以使用它们?如果不是,在BASH脚本和C++程序之间共享变量的最佳方法是什么?我能想到的唯一解决方案是将输出写入文件。我不想在控制台中打印此数据。非常感谢您的帮助。,c++,bash,environment-variables,C++,Bash,Environment Variables,每个流程都有自己的环境变量副本,在启动新流程时,通过从父流程复制环境变量来初始化环境变量。当您在流程中更改环境变量时,父流程对此一无所知 为了将信息从孩子传递回父母,您需要设置其他类型的通信通道。它可以是磁盘上的文件,也可以是管道,或者(取决于您父母的能力,bash可能无法完成所有这些)共享内存或其他IPC机制。然后,父程序将负责根据从子程序收到的信息更改自己的环境变量。据我所知,在“标准”GNU/Linux环境下,您可以通过3种方式设置环境变量: 使用命令行实用程序,如导出 为用户编辑文件,

每个流程都有自己的环境变量副本,在启动新流程时,通过从父流程复制环境变量来初始化环境变量。当您在流程中更改环境变量时,父流程对此一无所知

为了将信息从孩子传递回父母,您需要设置其他类型的通信通道。它可以是磁盘上的文件,也可以是管道,或者(取决于您父母的能力,
bash
可能无法完成所有这些)共享内存或其他IPC机制。然后,父程序将负责根据从子程序收到的信息更改自己的环境变量。

据我所知,在“标准”GNU/Linux环境下,您可以通过3种方式设置环境变量:

  • 使用命令行实用程序,如导出
  • 为用户编辑文件,如
    ~/.profile
    ~/.bashrc
    ,或为系统编辑
    /etc
    下的等效文件
  • 向这样的命令提供临时值
    CXX=g++CUSTOM\u VERSION=2.5命令

最后一个通常用于自定义构建,这很好,因为它不会损害系统,不会干扰任何系统设置、值或文件,并且在执行命令后一切都会恢复正常。如果您希望对一组特定的变量进行临时修改,这是最好的方法。

程序无法在其父级中设置环境变量。或者,好吧,没有合法的方式。使用
ptrace
侵入其进程不算数。:-)

您应该做的是在标准输出上输出环境变量。让shell脚本读取并设置它们。如果环境变量是您输出的所有变量,则调用非常简单:

`program`
反勾号将捕获程序的输出。然后,它将用输出替换回刻度。这将是设置shell变量的命令。然后在稍后的shell脚本中,确保执行以下操作:

export VAR1
export VAR2

您需要export命令才能将它们移动到从shell启动的程序所传递的环境中。

您无法设置在进程生命周期内仍然有效的环境变量,因此最简单的解决方案是按照建议写入输出文件或写入从Bash传下来的特定文件句柄:

C++:

狂欢节:


这可能是一个很好的主意,但它应该会起作用:)

如果您的程序通过标准输出以字符串形式返回变量,如下所示:

FOO=23; BAR=45;
eval `./your_program`
然后,bash可以这样称呼它:

FOO=23; BAR=45;
eval `./your_program`
bash可以访问end$FOO和$BAR

要测试此功能,请尝试:

eval `echo "FOO=23; BAR=45;"`
echo "$FOO $BAR"
当然,在这个方法中,程序不会更改调用进程的环境变量(这是不可能的),只会返回一个字符串,然后由bash对该字符串求值,求值设置变量


如果您的程序处理来自不可信源的输入,请不要使用此方法。如果有人欺骗您的程序将“rm-rf/”打印到标准输出,您将注定要失败。

我个人只有在16位DOS汇编程序中才能做到这一点,方法是跟踪指向上一个进程的指针,直到它指向自身,这意味着您已经到达COMMAND.COM的第一个实例,然后手动更改其环境。

如果您不喜欢文件,那么管道呢?看看
ssh-agent
如何输出用户需要添加到用户环境中的变量。这几乎就是下面简·沃贝尔建议的解决方案。这是一种可能的方法,但我不确定它是否会上升到一个应该的水平。事实上,任何时候直接执行程序输出,都会产生各种新的潜在安全漏洞。这不是不可能做到的,但是很难做到。我认为这是UNIX的方式,因为很多UNIX工具都是这样做的。