我一直在学习 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
在那之后才会获取。