Answers:
传统上,在Unix系统上定义每个用户环境变量的位置是~/.profile
。如果登录外壳程序是与Bourne兼容的外壳程序,则登录外壳程序(即登录时启动的程序,可以在其中键入命令)读取该文件。
Bash是与Bourne兼容的外壳。当作为登录名调用它时,shell读取~/.bash_profile
该文件是否存在,~/.profile
如果~/.bash_profile
不存在。
根据经验,如果您以文本模式(例如,在文本控制台上或使用ssh远程)键入密码,那么您获得的外壳就是登录外壳。
但是,如果您在图形程序中键入密码并登录到图形环境,则会绕过常规的登录外壳。.profile
在这种情况下是否读取取决于图形会话的设置方式。例如,它在Linux发行版之间,显示管理器之间以及桌面环境之间会有所不同。有时,链中的程序之一会显式调用登录外壳程序。有时其中一个程序明确读取~/.profile
; 有时这些~/.profile
都不会发生,并且不会被读取。
举一个可变性的例子,据我快速浏览所涉及的脚本,在Ubuntu 10.04上:如果使用kdm或lxdm登录,~/.bash_profile
则读取是否存在,~/.profile
否则;如果您使用gdm登录,则只能~/.profile
读取;如果使用xdm登录,~/.profile
则不会读取。
我知道的所有系统都提供了一些设置每个用户环境变量的方法。不幸的是,没有普遍的答案。
请注意,有时您会看到关于在中设置环境变量~/.bashrc
或在GUI环境中的每个终端中启动登录Shell的建议。两者都是坏主意;原因之一是您遇到的问题,即您的环境变量仅在通过终端启动的程序中可用,而在直接用图标,菜单或键盘快捷键启动的程序中不可用。
.profile
登录时将读取@William 。将环境变量放入将.bashrc
不起作用,并且您的场景说明:运行此shell的(可能是GUI)应用程序应该具有您的环境变量,但是如果在中定义它们.bashrc
,则不会。 t。
确切的答案是在Bash启动文件的bash手册页部分中。“启动不是登录shell的交互式shell时,Bash从〜/ .bashrc读取并执行命令(如果该文件存在的话)。”
回答您的其他问题,指出eshell实际上并未运行bash
。Emacs eshell
不是bash
。假定eshell
将加载.bashrc
与假设zsh
或csh
将加载相同的错误.bashrc
。这是一个不同的外壳。
我看到两个选择:
bash
和elisp代码eshell
。您可能还对将目录添加到没有重复项的路径的讨论感兴趣。