Answers:
export
使变量成为子进程环境中将包含的变量。它不会影响其他已经存在的环境。通常,没有一种方法可以在一个终端中设置变量并使它自动出现在另一个终端中,为每个进程单独建立环境。
将其添加到您的表中.profile
可以使您每次登录时都将环境设置为包括该新变量。因此,它不是从一个shell导出到另一个shell,而是指示一个新的shell在设置初始环境时将其包括在内。
每个过程都有几个属性,可以分别和独立于其他过程设置该过程。例如资源限制,umask,当前目录,环境变量等等。在进程创建时(通过fork()
系统调用),子级将从父级继承这些属性。此后,子进程可以任意设置这些属性。(存在一些限制,进程可能不会增加硬资源限制或将其当前目录更改为没有exec权限的目录。)
只有很少的程序会修改其环境变量,而大多数程序则无需理会。假设后一种情况。因此,如果子进程自己创建更多子进程,则这些进程将具有与祖父母相同的环境变量。等等。
现在,shell具有很多可以查看的变量set
(在Bourne Shell类型的shell中,关于C Shell的名称是dunno)。除非对这些变量进行了export
编辑,否则它们不是环境变量。可以使用查看环境变量env
。如果从shell命令行启动程序,则该程序将从shell继承环境变量。从shell脚本启动的程序也是如此。
因此,在登录时,会有一个外壳程序读取配置文件数据(例如~/.profile
),并将其继承给几乎所有子代,孙代等等。这就是环境变量设置如何从登录Shell或登录脚本滴入登录会话中启动的所有其他程序的方式。
我在一个终端窗口中创建了一个环境变量,并试图在另一个终端窗口中回显它。那什么也没显示。
通过以上解释,这是预期的结果。流程环境的更改仅影响此后创建的该流程的子级,而不影响现有的子级。
$TEST=hello
除非禁用了变量扩展或$TEST
已经具有合适的值,否则无论如何这都是不可能的。如果要分配hello
给变量,TEST
则必须说TEST=hello
(注意:no $
)。
之后,我将其导出,然后
echo
在另一个终端窗口中再次尝试。结果和以前一样。
再一次,这是预期的结果。
但是,如果我在登录时执行相同的代码(将代码附加到
~/.profile
文件中),则可以在任何终端窗口中使用变量。
这是因为终端中的外壳程序是外壳程序的后代,该外壳程序从中读取环境设置~/.profile
并因此继承了这些设置。