2014-01-19 156 views
0

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

我有一个问题回答“我们怎样才能显示在终端中定义的所有环境变量?”

首先,我认为这是“printenv”,但随后又表示“定义在终端”和我认为这意味着我读过的导出的环境变量用“env”显示。

我有点困惑。

回答

1

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

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

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

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

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

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

0

可能会在不同的操作系统之间有所不同,但我的理解是导出的变量仅适用于该会话(即打开终端,导出环境变量,打开另一个终端并且未在新终端上设置导出的env),而环境变量持久性(会话之间,重新启动等)。根据不同类型的env如何应用于应用程序,我没有意识到任何(除非你想要导出的env应用,那么你必须在运行应用程序之前将其导出)。