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

Unix 导出的环境变量与环境变量,unix,Unix,导出的环境变量和环境变量之间有什么区别 我必须回答一个问题“我们如何显示终端中定义的所有环境变量?” 首先我认为它是“printenv”,但后来它又说了“在终端中定义”,我认为这意味着我读到的导出的环境变量,它们显示为“env” 我有点困惑。不同操作系统之间可能会有所不同,但我的理解是,导出的变量仅用于该会话(即打开终端、导出环境变量、打开另一个终端,并且导出的环境未在新终端上设置),而环境变量是持久的(会话之间、重新启动等) 关于不同类型的环境如何应用于应用程序,我不知道有什么(除非您希望应用

导出的环境变量和环境变量之间有什么区别

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

首先我认为它是“printenv”,但后来它又说了“在终端中定义”,我认为这意味着我读到的导出的环境变量,它们显示为“env”


我有点困惑。

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


关于不同类型的环境如何应用于应用程序,我不知道有什么(除非您希望应用导出的环境,那么您必须在运行应用程序之前导出它)。

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

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

但这是一个愚蠢的区别。shell不跟踪其环境变量的历史起源。您无法让它告诉您哪些是“在终端中定义的”。它不知道。(
历史| grep导出
?Ugh…)

根据Charles Goodwin的回答,unix中没有“持久性”环境变量。持久变量的幻觉可以通过将定义放入shell启动文件(
/etc/profile
$HOME/.profile
,等等)来创建,但该定义将是一个
导出
命令,与手动运行的
导出
命令无法区分

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

环境可以更准确地称为“遗传变量”——信息只以一种方式从父代流向子代。现在更改术语有点太晚了