导出的环境变量与环境变量

时间:2014-01-19 19:30:41

标签: unix

导出环境变量和环境变量有什么区别?

我必须回答一个问题“我们如何显示在终端中定义的所有环境变量?”

首先我认为它是“printenv”,但它再次说“在终端中定义”,我认为这意味着我读过的导出环境变量它们用“env”显示。

我有点困惑。

2 个答案:

答案 0 :(得分:1)

export是一个创建环境变量的命令。短语“导出的环境变量”是多余的。

shell可能有一些不是用export命令创建的环境变量,因为每个程序都是从调用程序通过execve系统调用传递的环境开始的,所以我猜你可以说有些环境变量从未被“导出”。

但这是一个愚蠢的区别。 shell不跟踪其环境变量的历史起源。没有什么可以让它告诉你哪些是“在终端中定义的”。它不知道。 (history | grep export?呃......)

回应Charles Goodwin的回答,unix中没有“持久”环境变量。可以通过将定义放在shell启动文件(/etc/profile$HOME/.profile等)中来创建持久变量的错觉,但该定义将是export命令,无法区分export命令您手动运行。

在某些系统上,存在/etc/environment文件,这会产生一组更强大的“共享,持久”环境变量错觉,但实际上它们都不是。它不包含export关键字,因为它没有被shell解析--PAM在启动shell之前处理它。它与/etc/profile的原理相同 - 每次登录时都必须将文件读入初始进程的环境。您可以通过尝试“修改并检入另一个进程”来查看这些值是不是共享的。试验来自/ etc / environment的变量,甚至修改/etc/environment文件并检查对已有进程的影响 - 不会有任何变量。

环境可以更准确地称为“遗传变量” - 信息只通过它们的一种方式流动,从父母到孩子。改变术语有点太晚了。

答案 1 :(得分:0)

可能在操作系统之间有所不同,但我的理解是导出的变量仅适用于该会话(即打开终端,导出环境变量,打开另一个终端,导出的env未在新终端上设置),而环境变量是持久的(在会议之间,重新启动等)。

就不同类型的env如何应用于应用程序而言,我并不知道(除非您希望导出的env能够应用,否则您必须在运行应用程序之前将其导出)。