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

Isr*_*rar 4 linux bash cross-compilation

我正在关注从头开始交叉编译的 Linux - Embedded .In [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
Run Code Online (Sandbox Code Playgroud)

那么PS1的合适位置是什么?

Kus*_*nda 14

PS1 shell变量应被设置~/.bashrcbash外壳为是阅读交互shell会话初始化文件。

请注意,这个变量是一个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
Run Code Online (Sandbox Code Playgroud)

然后设置PS1~/.bashrc(应该没有必要去碰HOMETERM)。

该命令所做的另一件事是使用env -i. 除非您有非常具体的理由这样做,否则您不应该从普通的 shell 启动文件中这样做。


Adm*_*Bee 5

引用 bash手册页

当 bash 作为交互式登录 shell 或带有该选项的非交互式 shell 被调用时--login,它首先从文件中读取并执行命令/etc/profile(如果该文件存在)。读取该文件后,它会按顺序查找~/.bash_profile~/.bash_login、 和,并从第一个存在且可读的文件中读取并执行命令。当 shell 启动时可以使用~/.profile该选项来抑制此行为。--noprofile

当登录 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),请将其放入profile中。
  • 如果您想让PS1所有非登录shell 都处于活动状态(例如,只需在桌面环境中打开另一个终端),请放入bashrc
  • 如果你想在这两种情况下都激活它,你需要将它放在两个文件中,或者(某些 Linux 版本至少在系统范围的/etc/profile/etc/bash.bashrc中这样做) ,在.profile中获取.bashrc