为什么 .profile(而不是 .bashrc)将 ~/bin 附加到路径?

bor*_*ges 9 command-line bash .profile

由于.bashrc更“通用”(就其.profile来源而言),为什么“包含~/bin到路径”程序不在内部.bashrc?为什么用户不希望在非登录 shell 中使用它?(尤其是如今,非登录 shell 更为常见*。)

我知道我可以手动进行此类更改,但我想知道是否有原因。

*无法证明,但我认为是这样。

Eli*_*gan 13

~/.bashrc并且/etc/bash.bashrc在每次bash启动交互式shell时运行。

相反,每次启动任何登录shell时都会运行~/.profile和。所以它不必是一个shell,但它必须是一个登录 shell(并且许多shell 实例不是登录 shell)。/etc/profilebashbash

  • bash壳是一个壳,其中所述壳的程序,提供它bash,而不是某些其他程序,如dash
  • 登录 shell 是在登录后自动启动的 shell,为登录提供用户界面(图形或命令行)。当退出登录 shell 时,登录终止。

因此,PATHbashrc文件中添加一个将条目附加到的命令将:

  1. 当 shell is not 时什么都不做bash,这通常是这种情况。例如,PATH当您在图形登录会话中时不会被修改。请记住,PATH不仅仅是命令行程序使用。

  2. 在存在嵌套bashshell的情况下一遍又一遍地追加它。所以,如果你在一个 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
Run Code Online (Sandbox Code Playgroud)

非登录 shell 将登录 shell(或行为类似于登录 shell 的东西)作为其父级,并PATH从该登录 shell继承其大部分环境变量,包括。因此,放入路径修改命令~/.profile需要您注销并重新登录以使它们生效,但这也会影响非登录 shell 的环境(以及非 shell 程序的环境,因为每个程序都获得了它的自己的一组环境变量——称为它的“环境”——从它的父进程继承而来)。