为什么我必须在打开的每个终端中输入“source .profile”?

为什么我必须在打开的每个终端中输入“source .profile”?

当我们在 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 服务器。

相关内容