由于`.bashrc`更加“通用”(在这个意义上,`.profile`会引用它),为什么“将`~/bin`包含到路径中”的步骤不在`.bashrc`中呢?为什么用户不希望在非登录shell中使用它呢?(尤其是现在,非登录shell更加常见*。)
我知道我可以手动进行这样的更改,但我想知道是否有原因。
*无法证明,但我认为情况是如此。
我知道我可以手动进行这样的更改,但我想知道是否有原因。
*无法证明,但我认为情况是如此。
~/.bashrc
和/etc/bash.bashrc
在每次启动交互式bash
shell时运行。
相比之下,~/.profile
和/etc/profile
在每次启动任何登录 shell时运行。因此它不必是一个bash
shell,但它必须是一个登录 shell(而许多bash
shell实例并非登录 shell)。
bash
shell是指提供该shell的程序是bash
,而不是其他程序,比如dash
。bashrc
文件中放置一个附加条目到 PATH
的注释将会有以下效果:
当 shell 不是 bash
时(这种情况很常见),什么也不会发生。例如,当你处于图形登录会话时, PATH
不会被修改。请记住,PATH
不仅仅被命令行程序使用。
在存在嵌套的 bash
shell 时,它会一次又一次地追加。所以,如果你在一个 shell 中启动另一个 shell——这是非常常见的,出于各种原因——那么你的 PATH
将会有多个 ~/bin
条目。这使得 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
PATH
,来自于它的父进程。因此,在~/.profile
中放置修改路径的命令需要您退出并重新登录以使其生效,但这也会影响非登录Shell的环境(以及那些不是Shell的程序的环境,因为每个程序都会从其父进程继承一组环境变量,称为"环境")。