我在一个终端窗口中创建了一个环境变量,并尝试在另一个终端窗口中回显它。那什么也没显示。
$TEST=hello
之后,我将其导出并echo
在不同的终端窗口中再次尝试。结果和以前一样。
export TEST
但是如果我在登录时执行相同的代码(将代码附加到~/.profile
文件)变量可以在任何终端窗口中使用。这里发生了什么?在终端中执行代码与在登录时执行代码有什么不同?
答案1
export
使变量包含在子进程环境中。它不会影响其他已经存在的环境。一般来说,没有一种方法可以在一个终端中设置变量并使其自动出现在另一个终端中,环境是为每个进程自己建立的。
将其添加到您的.profile
环境中,以便您的环境将被设置为在您每次登录时包含该新变量。因此,它不会从一个 shell 导出到另一个 shell,而是指示新 shell 在设置初始环境时包含它。
答案2
每个进程都有多个属性,该进程可以独立于其他进程单独设置这些属性。例如资源限制、umask、当前目录、环境变量等等。在创建进程时(通过fork()
系统调用),子进程从父进程继承这些属性。此后子进程可以任意设置这些属性。 (存在一些限制,进程可能不会增加硬资源限制或将其当前目录更改为没有执行权限的目录。)
只有少数程序会修改其环境变量,大多数程序都不会打扰。假设是后一种情况。因此,如果子进程为自己创建了更多子进程,那么这些进程将具有与祖进程相同的环境变量。等等。
现在,一个 shell 有很多可以查看的变量set
(在 Bourne Shell 类型的 shell 中,不知道 C Shell 是怎样的)。这些变量不是环境变量,除非它们是export
ed 的。环境变量可以通过查看env
。如果从 shell 命令行启动程序,该程序将从 shell 继承环境变量。对于从 shell 脚本启动的程序也是如此。
因此,登录时有一个 shell 读取配置文件数据(例如~/.profile
)并将其继承给几乎所有的子代、孙子等。这就是环境变量设置如何从登录 shell 或登录脚本渗透到登录会话中启动的所有其他程序的方式。
我在一个终端窗口中创建了一个环境变量,并尝试在另一个终端窗口中回显它。那什么也没显示。
通过上面的解释,这就是预期的结果。进程环境的更改仅影响此后创建的进程的子进程,而不影响现有进程。
$TEST=hello
无论如何,这不太可能起作用,除非变量扩展被禁用或$TEST
已经有一个合适的值。如果你想分配hello
给变量TEST
那么你必须说TEST=hello
(注意:不$
)。
之后,我将其导出并
echo
在不同的终端窗口中再次尝试。结果和以前一样。
这又是预期的结果。
但是如果我在登录时执行相同的代码(将代码附加到
~/.profile
文件)变量可以在任何终端窗口中使用。
这是因为终端中的 shell 是从中读取环境设置~/.profile
并因此继承这些设置的 shell 的后代。