为什么 PATH 定义在 ~/.profile 中,尽管使用 bash 启动终端只执行 ~/.bashrc?

为什么 PATH 定义在 ~/.profile 中,尽管使用 bash 启动终端只执行 ~/.bashrc?

guest我的 Debian 系统上有一个带有 XFCE 桌面的用户帐户。

~/.profile默认添加了一个文件。该文件的最后几行是:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

echo .profile executed

最后一条echo命令是我添加的。我确保它$HOME/bin存在。

guest@debian:~$ ls -ld $HOME/bin
drwxr-xr-x 2 guest guest 4096 Jan  9 09:42 /home/guest/bin

启动 Debian 系统后,我使用该帐户登录 XFCE 桌面 guest并启动终端 (xfce4-terminal)。但我没有看到任何~/.profile已执行的证据。

guest@debian:~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

man bash可以很清楚地知道是~/.profile在交互式登录 shell 还是带有选项的非交互式 shell 中读取和执行的--login~/.bashrc是在交互式非登录 shell 中执行的,因此当 xfce4-terminal 启动 bash 时,似乎~/.profile没有执行。

如果~/.profile在启动新终端时没有执行,为什么会PATH在中更新~/.profile

Debian 难道不应该提供PATH更新~/.bashrc以便用户在启动终端时可以使用它吗?

答案1

man bash

当 bash 作为交互式登录 shell 或使用 −−login 选项作为非交互式 shell 调用时,它首先从文件/etc/配置文件,如果该文件存在。读取该文件后,它会查找的〜/ .bash_profile〜/ .bash_login, 和〜/ .profile,按该顺序,从第一个存在且可读的命令读取并执行命令......

当启动非登录 shell 的交互式 shell 时,bash 会从~/.bashrc,如果该文件存在....

我明白那个

  1. ~/.bashrc: 用于交互式 shell
  2. ~/.bash_profile, ~/.bash_login, ~/.profile: 用于登录 shell

PATH因此,如果您需要在终端(一个交互式 shell)中修改,那么您可能需要将该PATH设置放入~/.bashrc;或者,您可以在非登录 shell 中随时~/.profile从中获取源,例如:~/.bashrc

shopt -q login_shell || . ~/.profile

至于为什么PATH设置~/.profile为推荐方式,我认为用户的定义PATH应该在用户登录时设置正确,“登录”可以是bash、、zsh或 GUI,或其他。

场景一:有些用户可能希望非X作为默认的工作环境;并且X是通过在登录虚拟终端时startx正常运行或自动运行来调用的。~/.profiletty7

[ -z $DISPLAY -a $XDG_VTNR -eq 7 ] && exec startx

~/.profile在这种情况下,用户需要仔细选择在、~/.bashrc和 中设置什么~/.xinitrc,以便他们拥有所需的环境变量集 --- PATHEDITORVISUALBROWSER等--- 无论他/她是在以下环境中工作:

  1. 控制台(Ctrl+Alt+F[1-6]),或通过以下方式无需 X 登录ssh~/.profile+~/.bashrc
  2. X 中的非终端程序:~/.profile+~/.xinitrc
  3. X 中的终端仿真器:~/.profile++~/.xinitrc~/.bashrc

所以,设置PATH~/.profile是最好的选择,用户可以在非X环境下设置EDITOR为设置在 ,而在X环境下则改为 设置在。vim~/.profileemacs~/.xinitrc

场景 2:GUI 用户登录XFCEbashPATH可以设置~/.xsessionrc这里解释

场景三:用户zsh可以PATH在 中设置~/.zprofile。 的交互设置bash位于 中~/.bashrc, 的交互设置zsh位于 中~/.zshrc

答案2

~/.profile在您使用控制台模式而非 GUI 模式登录时执行。您可以使用按键F1, F2 ...使用控制台模式登录。

答案3

Edit -> Profile Preferences -> Title and Command -> "Run command as a login shell"

如果可用,则进行通常的~/.profile加载,如果 - 假设存在于您的环境中。~/.bashrc$BASH_VERSION

请记住,~/.profile如果您的家中有,则会被忽略~/.bash_profile~/.bash_login并且由于它被忽略,因此~/.bashrc也没有来源。

这个答案来源于这里在研究类似问题时。并且Unix 和 Linux 的答案提到了 Debian 如何处理 shell 配置,并提供了可能有帮助的链接。

答案4

我的理解一直是,它.bashrc特定于 bash,并且.profile是跨 shell 的。对于大多数家庭用户来说,这可能不是问题,但有时我使用的系统是用户喜欢的ksh(并强制新用户选择)。如果出于某种原因您获得了 bournshell,.profile也会使用。请注意,zsh 和 csh 不使用 .profile。

相关内容