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变量应被设置~/.bashrc为bash外壳为是阅读交互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(应该没有必要去碰HOME或TERM)。
该命令所做的另一件事是使用env -i. 除非您有非常具体的理由这样做,否则您不应该从普通的 shell 启动文件中这样做。
引用 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。