PS1 shell 变量的正确位置是什么?

PS1 shell 变量的正确位置是什么?

我正在关注从头开始交叉编译的 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应该不需要触摸HOMETERM)。

该命令执行的另一件事是使用 清除所有其他环境变量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 filefile/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

相关内容