运行子 bash 时自定义提示不成立

运行子 bash 时自定义提示不成立

我一直在学习 bash,在学习期间,我尝试了一下文件.bash_profile以便能够放置问候消息等。后来我删除了这些更改。但这样做之后,我的默认提示配置就丢失了:最初,提示全部为粗体,\w部分为蓝色,这样当我处于深层嵌套目录中时,提示就不会显得那么纠结。我认为这是 Ubuntu 的默认设置(如果我错了,请纠正我),但是就像我说的那样,它丢失了,我的提示不粗体且是单色的,导致我在长名称目录中时一片混乱。

因此,昨晚我尝试按照上面提到的方式自定义提示。在将代码添加到.bash_profile

代码如下:

export PS1="\[$(tput bold)\]\u@\h:\[$(tput sgr 0)\]\e[1;34m\w$ \e[m"

但是,如果我尝试在当前 bash shell 中运行另一个 bash shell,提示符将变为未格式化:

这正常吗?导出变量的全部目的难道不是为了让该 shell 派生的所有子进程都可以访问它吗?为什么这不适用于这种情况?

答案1

.bash_profile仅由登录 shell 提供。它在您登录 X 会话时提供,并且环境继承自 @Serg 详细解释的内容。您以某种方式管理了此环境不会被覆盖的配置.bashrc,也许将您的终端设置为默认打开登录 shell。我可以通过像这样配置我的终端来重现您遇到的行为:

这会导致 shell 作为登录 shell 打开,但任何被调用的子进程都将是非登录 shell,并且源进程.bashrc也不会是,.bash_profile除非如@Serg 所建议的那样,-l使用了该标志。

总结
如果你希望自定义提示符由交互式 shell 提供,请将代码放入你的.bashrc

答案2

总结:只需将调用放入PS1或使用标志~/.bashrc调用子 shell-l

Zanna 的回答恰当地建议PS1采用~/.bashrc交互式 shell 来获取信息。

但是,你可以使用-l标志将子 shell 视为登录 shell:

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ echo "PS1='TEST$ '" > ~/.profile

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash
xieerqi@eagle:~$ exit

DIR:/xieerqi|04:25|skolodya@ubuntu:
$ bash -l
TEST$ 

“为什么”

这正常吗?导出变量的全部目的难道不是为了让该 shell 派生的所有子进程都可以访问它吗?为什么它不适用于这种情况?

是的,这是预期的行为。导出某些内容时,变量应该向下传播到子 shell。

xieerqi@eagle:~$ export VAR=303
xieerqi@eagle:~$ bash
xieerqi@eagle:~$ echo $VAR
303
xieerqi@eagle:~$ ksh
$ echo $VAR
303

问题又来了~/.bashrc默认 ~/.bashrc文件有覆盖的行PS1。因此,你的变量曾是导出,但一旦交互式 shell 源化,就会使用~/.bashrc。这种情况的例子已经被观察到吉尔斯的回答关于其中一个问题 Unix Stackchange

实际上,~/.profile我们鼓励从那里设置和导出环境变量,这是一种常见的做法。

为了解决 Zanna 关于为什么第一个贝壳被着色的评论,我相信这是原因:

当 bash 作为交互式登录 shell 调用时...它首先从文件 /etc/profile 读取并执行命令(如果该文件存在)。读取该文件后,它会查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,以该顺序并读取和执行命令从第一个 存在且可读。(来自 bash 手册页,重点添加)

所发生的情况是,一旦您登录,bash就会找到~/.bash_profile并获取它作为找到的第一个文件。其他 shell 是交互式非登录 shell,因此只有 ~/.bashrc在那之后才会获取。

相关内容