导出环境变量和环境变量有什么区别?
我必须回答一个问题“我们如何显示在终端中定义的所有环境变量?”
首先我认为它是“printenv”,但它再次说“在终端中定义”,我认为这意味着我读过的导出环境变量它们用“env”显示。
我有点困惑。
答案 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能够应用,否则您必须在运行应用程序之前将其导出)。