为什么我在打开的每个终端中都必须`source .profile`?


10

当我们~/.profile在Ubuntu中更改某些变量时,我们将执行命令source .profile。然后,该更改在此终端中有效。如果打开新终端,则必须source .profile再次执行命令。因此,尽管不同的终端可能属于同一用户,但它们似乎具有自己的环境。

使每个终端都有自己的环境路径的好处是什么?似乎属于同一用户的不同终端共享相同的环境变量会更好。



如果您的登录“外壳”是GUI,则在sh的登录脚本(而不是GUI)中设置var并没有多大帮助。
ikegami

Answers:


14

这样做的原因~/.profile是仅由登录外壳程序提供。当您打开一个新的终端窗口时,默认情况下,启动的外壳是非登录外壳。如果注销并重新登录,则对的更改~/.profile将在所有终端中生效,因为更改~/.profile是在您登录会话时产生的。

并非不同的终端窗口具有不同的环境,而是采购~/.profile~/.profile在当前shell中执行(这正是source命令的作用)。

相比之下,对的更改~/.bashrc将立即影响您打开的任何新终端窗口,或您通过键入开头的任何Bash Shell bash,因为它是由所有交互式Bash Shell产生的。


3

环境变量不仅用于用户首选项。它们是一种通用机制,用于将各种设置信息从父进程传递到其启动的子进程。

在很多情况下,流程将设置特定的环境变量以影响开始的流程。例如,脚本可能会故意重置其启动命令的语言环境设置,以便它可以解析它们的输出。许多大型软件包的构建脚本使用嵌套调用,make这些调用通过环境变量相互协调。专用工具可能需要通过使用$ LD_PRELOAD或$ PATH技巧来更改它们启动的其他程序的工作条件。

如果用户在另一个编译器中运行长时间编译时在另一个窗口中执行某项操作,只会神奇地改变其背后所有进程的环境变量,则会导致疯狂和混乱。

其他环境变量包含有关启动进程的特定会话的信息。程序期望$ TERM描述它们所连接的特定终端(或终端仿真器)的命令集;进行常规的按用户设置将无法使用几种不同类型的终端登录到同一系统。即使您只有一个终端硬件并且从不远程登录,诸如此类的程序也screen依赖于为其会话内运行的进程设置不同的$ TERM。

一个更好的问题是,为什么我们要使用进程到子进程的通信机制来进行用户首选项设置,而不是按用户数据库?

答:因为它工作得很好,使每个用户数据库的好处是不是足够大,改变的工作,一切都使用的是不是环境变量将被完成。

(我能想到的极少数偏好设置那里不会没有一些使用情况下,它的方便,以改变他们只是为了执行一个脚本,例如,所以为了减肥功能,一切仍然将需要重写由环境变量,从而增加了复杂性,并使用户更加困惑。

似乎不存在替代方案。例如,X资源是每个显示会话而不是每个进程。但是使用命令行程序很难访问它们-命令行程序通常需要用于甚至没有 X服务器连接的远程登录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.