是否可以从终端运行 c++ 应用程序并在某些条件下将命令返回到调用它的终端?例如,如果我要在我的终端中并在我的选择之后运行一个应用程序;我的应用程序需要通过运行导出命令来更改我的 PATH,例如:
(使用 BASH)
export PATH=.:/home/User/application/bin:$PATH
完成后,在我的应用程序完全关闭之前,我可以让应用程序使用上述命令更改我的终端本地环境变量吗?Qt 是否提供了这样做的方法?提前感谢您的帮助!
是否可以从终端运行 c++ 应用程序并在某些条件下将命令返回到调用它的终端?例如,如果我要在我的终端中并在我的选择之后运行一个应用程序;我的应用程序需要通过运行导出命令来更改我的 PATH,例如:
(使用 BASH)
export PATH=.:/home/User/application/bin:$PATH
完成后,在我的应用程序完全关闭之前,我可以让应用程序使用上述命令更改我的终端本地环境变量吗?Qt 是否提供了这样做的方法?提前感谢您的帮助!
不,您不能更改父应用程序环境。
为什么?当您的父应用程序启动您的应用程序时(可能使用system()
),它实际上是fork()
ed - 子进程诞生为几乎完全复制父进程,然后该子进程使用execve()
调用,它将该进程的可执行映像完全替换为您的应用程序的可执行映像(对于脚本,它将是解释器(如 bash)的图像)。
除此之外,这个过程还准备了更多的东西。一个是打开文件的列表,从文件句柄 0、1、2(stdin、stdout、stderr)开始。此外,它创建了包含环境变量(作为键=值对)的内存块(属于子进程地址空间)。
因为环境块属于你的进程,你可以随意改变你自己的环境。但是,您的进程不可能更改父进程(或任何其他进程)的环境内存块。可能实现这一点的唯一方法是使用 IPC(进程间通信)并温和地要求父级在其中执行此任务,但父级必须积极监听(在本地或网络套接字上)并愿意满足此类请求来自某人,并且在这方面与任何其他过程相比,孩子并没有什么特别之处。
这也是为什么您可以使用一些 shell 脚本更改 bash 环境的原因,但只能使用source
or .
bash 宏 - 因为它是由 bash 本身处理的,而不启动任何外部进程。
但是,由于上述原因,您不能通过执行任何其他程序或脚本来更改环境。
常见的解决方案是让您的应用程序将结果打印到标准输出,然后让调用者将其传递给它的环境。一个教科书示例是ssh-agent
打印环境变量分配;你通常调用它eval $(ssh-agent)