既然更“通用”(从来源.bashrc
意义上讲),为什么“包含到路径”过程不在里面?为什么用户不希望在非登录 shell 中使用它?(尤其是在现在,非登录 shell 更常见*。).profile
~/bin
.bashrc
我知道我可以手动进行这样的更改,但我想知道是否有原因。
*无法证明,但我认为情况确实如此。
答案1
~/.bashrc
/etc/bash.bashrc
每次bash
启动交互式 shell时都会运行。
相反,~/.profile
每次/etc/profile
发生任何登录shell 已启动。因此,它不一定是 shell bash
,但它必须是登录外壳(并且许多bash
shell 实例不是登录 shell)。
- shell
bash
是提供它的 shell 程序bash
而不是其他程序,例如dash
。 - 登录 shell 是登录后自动启动的 shell,用于为登录提供用户界面(图形或命令行)。退出登录 shell 时,登录终止。
PATH
因此,在文件中附加条目的注释bashrc
将:
没做什么当 shell 不是 时
bash
,这种情况经常发生。例如,PATH
当您处于图形登录会话中时, 不会被修改。请记住,PATH
不仅仅由命令行程序使用。一遍又一遍地追加在存在嵌套 shell 的情况下
bash
。因此,如果您在 shell 中启动 shell(出于各种原因,这种情况非常常见),那么您将有多个~/bin
条目堆叠在您的 上PATH
。这会使PATH
环境变量难以读取,有时还会降低性能。
这些都是不受欢迎的。因此错误的把它放在一个bashrc
文件中;它确实属于~/.profile
。~/.profile
是正确的地方为了:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
非登录 shell 以登录 shell(或类似登录 shell 的程序)为父级,并PATH
从此登录 shell 继承其大部分环境变量,包括。因此,输入路径修改命令~/.profile
需要您注销并重新登录才能生效,但它也会影响非登录 shell 的环境(以及非 shell 程序的环境,因为每个程序都有自己的一组环境变量 - 称为其“环境” - 继承自其父进程)。
答案2
这是因为传统上环境变量只存在于/etc/profile
或中.profile
。该bashrc
文件用于别名、提示设置、shell 选项等(即与 shell 直接相关的内容)。