![为什么 PATH 定义在 ~/.profile 中,尽管使用 bash 启动终端只执行 ~/.bashrc?](https://linux22.com/image/1550343/%E4%B8%BA%E4%BB%80%E4%B9%88%20PATH%20%E5%AE%9A%E4%B9%89%E5%9C%A8%20~%2F.profile%20%E4%B8%AD%EF%BC%8C%E5%B0%BD%E7%AE%A1%E4%BD%BF%E7%94%A8%20bash%20%E5%90%AF%E5%8A%A8%E7%BB%88%E7%AB%AF%E5%8F%AA%E6%89%A7%E8%A1%8C%20~%2F.bashrc%EF%BC%9F.png)
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,如果该文件存在....
我明白那个
~/.bashrc
: 用于交互式 shell~/.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
正常运行或自动运行来调用的。~/.profile
tty7
[ -z $DISPLAY -a $XDG_VTNR -eq 7 ] && exec startx
~/.profile
在这种情况下,用户需要仔细选择在、~/.bashrc
和 中设置什么~/.xinitrc
,以便他们拥有所需的环境变量集 --- PATH
、EDITOR
、VISUAL
、BROWSER
等--- 无论他/她是在以下环境中工作:
- 控制台(Ctrl+Alt+F[1-6]),或通过以下方式无需 X 登录
ssh
:~/.profile
+~/.bashrc
- X 中的非终端程序:
~/.profile
+~/.xinitrc
- X 中的终端仿真器:
~/.profile
++~/.xinitrc
~/.bashrc
所以,设置PATH
在~/.profile
是最好的选择,用户可以在非X环境下设置EDITOR
为设置在 ,而在X环境下则改为 设置在。vim
~/.profile
emacs
~/.xinitrc
场景 2:GUI 用户登录XFCE
时bash
,PATH
可以设置~/.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。