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

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

既然更“通用”(从来源.bashrc意义上讲),为什么“包含到路径”过程不在里面?为什么用户不希望在非登录 shell 中使用它?(尤其是在现在,非登录 shell 更常见*。).profile~/bin.bashrc

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

*无法证明,但我认为情况确实如此。

答案1

~/.bashrc/etc/bash.bashrc每次bash启动交互式 shell时都会运行。

相反,~/.profile每次/etc/profile发生任何登录shell 已启动。因此,它不一定是 shell bash,但它必须是登录外壳(并且许多bashshell 实例不是登录 shell)。

  • shellbash是提供它的 shell 程序bash而不是其他程序,例如dash
  • 登录 shell 是登录后自动启动的 shell,用于为登录提供用户界面(图形或命令行)。退出登录 shell 时,登录终止。

PATH因此,在文件中附加条目的注释bashrc将:

  1. 没做什么当 shell 不是 时bash,这种情况经常发生。例如,PATH当您处于图形登录会话中时, 不会被修改。请记住,PATH不仅仅由命令行程序使用。

  2. 一遍又一遍地追加在存在嵌套 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 直接相关的内容)。

相关内容