我正在关注从头开始交叉编译的 Linux - 嵌入式。
在部分3.3“设置环境”,PS1 在 中声明.bash_profile
。
当我以 身份登录时su - clfs
,两者.bash_profile
都会.bashrc
被执行。当我登录时su clfs
,只会.bashrc
被执行。
在这两种情况下,PS1 都不会更新终端。
当我将 PS1 放入 时.bashrc
,它会更新终端。
CLFS 书中已将其放入.bash_profile
:
cat > ~/.bash_profile << "EOF"
exec env -i HOME=${HOME} TERM=${TERM} PS1='\u:\w\$ ' /bin/bash
EOF
PS1的合适位置在哪里?
答案1
这PS1
外壳变量~/.bashrc
应该为shell设置,bash
因为这是为交互式 shell 会话读取的初始化文件。
注意这个变量是一个外壳变量,不是环境变量(让子进程继承它的值是没有意义的,只有当前的 shell 使用它)。因此,它不需要使用 导出export
。
有关的:
您不需要bash
从 shell 的任何启动文件启动。~/.profile
如果您正在运行的系统不允许您更改登录 shell,则可能需要从(或与您的登录 shell 相关的相应文件)启动特定 shell 。应注意不是如果另一个 shell 已经在执行该文件,则启动另一个 shell,否则您可能会陷入无限循环。
exec
您添加到您的代码中的代码永远~/.bash_profile
不会被需要。我想这是一种被解析的方式~/.bashrc
(它启动一个交互式外壳,然后交互式bash
外壳读取~/.bashrc
)。一种更好的方法是让一个文件来源另一个文件,例如在~/.bash_profile
:
if [[ -f $HOME/.bashrc ]]; then
source "$HOME/.bashrc"
fi
然后设置PS1
(~/.bashrc
应该不需要触摸HOME
或TERM
)。
该命令执行的另一件事是使用 清除所有其他环境变量env -i
。除非你有非常具体的原因为此,您不应该从普通的 shell 启动文件中执行此操作。
答案2
引用 bash 中的话手册页:
当 bash 作为交互式登录 shell 或带有该选项的非交互式 shell 被调用时
--login
,它首先从文件中读取并执行命令/etc/profile
(如果该文件存在)。读取该文件后,它会按顺序查找~/.bash_profile
、~/.bash_login
、 和~/.profile
,并从第一个存在且可读的文件中读取并执行命令。--noprofile
当 shell 启动时可以使用该选项来禁止此行为。当登录 shell 退出时,bash 会从文件中读取并执行命令
~/.bash_logout
(如果存在)。当启动非登录 shell 的交互式 shell 时,bash 会读取并执行来自
/etc/bash.bashrc
和 的命令~/.bashrc
(如果这些文件存在)。这可以通过使用该--norc
选项来抑制。该选项将强制 bash 从和读取并执行命令。--rcfile file
file
/etc/bash.bashrc
~/.bashrc
所以这很大程度上取决于您如何启动 shell。
- 如果你想
PS1
在所有方面都保持活跃登录shell(例如通过su - <user>
或通过远程登录时ssh
),将其放入轮廓。 - 如果你想
PS1
在所有方面都保持活跃未登录shell(例如,只需在桌面环境中打开另一个终端),放入bashrc。 - 如果你想让它在这两种情况下都处于活动状态,你需要将它放在两个文件中,或者(某些 Linux 版本至少在系统范围的情况下是这样做的)/etc/配置文件和/etc/bash.bashrc),来源.bashrc在里面。轮廓。
答案3
PS1
应该在.bashrc
。您也可以将其设置在.profile
。
Debian 从那里获取 .bashrc:
# if running bash
if [ -n "$BASH_VERSION" ]; then
# include .bashrc if it exists
if [ -f "$HOME/.bashrc" ]; then
. "$HOME/.bashrc"
fi
fi