当我们在 Ubuntu 中更改某个变量时~/.profile
,我们执行该命令source .profile
。然后更改就会生效仅有的在这个终端中。如果我们打开一个新终端,我们必须source .profile
再次执行该命令。所以看起来不同的终端虽然可能属于同一个用户,但都有自己的环境。
让每个终端都有自己的环境路径有什么好处? 如果属于同一用户的不同终端共享相同的环境变量,似乎会更好。
答案1
原因是~/.profile
仅由登录 shell 提供。当您打开新的终端窗口时,默认情况下启动的 shell 是非登录 shell。如果您注销并重新登录,则更改为 的更改~/.profile
将在您所有终端中生效,因为~/.profile
在您登录到会话时提供。
这并不是说不同的终端窗口有不同的环境,而是 sourcing~/.profile
只在当前 shell 中执行~/.profile
(这正是命令source
所做的)。
相比之下,对 的更改~/.bashrc
将立即影响您打开的任何新终端窗口,或者您通过键入 启动的任何 Bash shell bash
,因为它是由所有交互式 Bash shell 提供的。
答案2
环境变量不仅仅用于用户偏好设置。它们是一种通用机制,用于将各种设置信息从父进程传达给其启动的子进程。
在许多情况下,进程会设置特定的环境变量来影响只是它启动的进程。例如,脚本可能会故意重置它启动的命令的区域设置,以便它可以解析这些命令的输出。许多大型软件包的构建脚本使用嵌套调用,这些调用make
通过环境变量相互协调。专用工具可能需要通过使用 $LD_PRELOAD 或 $PATH 技巧来更改它们启动的其他程序的工作条件。
如果用户在另一个窗口中执行某项操作,而另一个窗口中正在运行一个长编译,那么环境变量就会神奇地改变全部他的这些行为背着他们进行,将会导致疯狂和混乱。
其他环境变量包含有关进程启动的特定会话的信息。程序需要 $TERM 来描述它们所连接的特定终端(或终端仿真器)的命令集;如果将其设置为一般的每个用户设置,则无法使用多种不同类型的终端登录到同一系统。即使您只有一个终端硬件并且从未远程登录过,诸如此类的程序也screen
依赖于为其会话内运行的进程设置不同的 $TERM。
更好的问题是,为什么我们对用户偏好设置使用进程到子进程的通信机制,而不是每个用户的数据库?
答案:因为它运作良好并且制作每个用户数据库的好处还不够大,以至于改变一切使用那而不是环境变量就可以了。
(我能想到的偏好设置中很少有不会有些用例很方便更改它们,例如,仅用于执行单个脚本。因此,为了不失去功能,一切仍然需要可覆盖环境变量,这会增加复杂性并让用户更加困惑)。
并不是说替代品不存在存在。例如,X 资源是按显示会话而不是按进程分配的。但是,命令行程序很难访问它们——而且命令行程序通常需要为远程登录工作,而这些远程登录甚至不需要有要连接的 X 服务器。