etk*_*tka 4 command-line bash prompt
我一直在学习 bash,在学习 bash 的同时,我玩弄了这个.bash_profile文件,以便能够放置问候信息等。后来我删除了这些更改。但是这样做之后,我的默认提示配置丢失了:最初,提示全部为粗体,\w部分为蓝色,这样当我在深度嵌套的目录中时,提示不会看起来如此纠结。我认为这是 Ubuntu 的默认设置(如果我错了,请纠正我),但是就像我说的那样丢失了,我的提示是非粗体和单色的,当我在长命名的目录中时会导致混乱。
所以,昨晚我尝试以我上面提到的方式自定义我的提示。在我添加代码后它运行良好.bash_profile
代码是这样的:
export PS1="\[$(tput bold)\]\u@\h:\[$(tput sgr 0)\]\e[1;34m\w$ \e[m"
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在当前的 bash shell 中运行另一个 bash shell,提示将变为无格式:
这是正常的吗?导出一个变量以使其可从该 shell 派生的所有子进程访问,这难道不是重点吗?为什么它不适用于这种情况?
.bash_profile仅来自登录 shell。登录X-session时就已经source了,继承的环境如@Serg详解。不知何故,您已经管理了一个配置,在该配置中,此环境不会被 覆盖.bashrc,也许将您的终端设置为默认打开登录 shell。我可以通过像这样配置我的终端来重现您遇到的行为:

这会导致 shell 作为登录 shell 打开,但任何被调用的子级都将是非登录 shell,而 source.bashrc不会,.bash_profile除非,正如@Serg 建议的那样,使用了该-l标志。
TL;DR
如果您希望通过交互式 shell 获取自定义提示,请将代码放在您的.bashrc
TL;DR:只需将调用PS1放入~/.bashrc或调用带有-l标志的子shell
赞纳的回答表明,适当地向集PS1在~/.bashrc以交互shell采购。
但是,您可以使用-lflag 将 subshell 视为登录 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$
Run Code Online (Sandbox Code Playgroud)
这是正常的吗?导出一个变量以使其可从该 shell 派生的所有子进程访问,这难道不是重点吗?为什么它不适用于这种情况?
是的,这是预期的行为。当你导出一些东西时,变量应该向下传播到子壳。
xieerqi@eagle:~$ export VAR=303
xieerqi@eagle:~$ bash
xieerqi@eagle:~$ echo $VAR
303
xieerqi@eagle:~$ ksh
$ echo $VAR
303
Run Code Online (Sandbox Code Playgroud)
问题又来了~/.bashrc。 默认 ~/.bashrc文件具有覆盖PS1. 因此,您的变量是导出的,但是一旦交互式 shell 源代码就使用了~/.bashrc。Gilles在Unix Stackexchange上的一个问题 的回答中观察到了这种情况的例子。
至于~/.profile实际上鼓励从那里设置和导出环境变量,这是一种常见的做法。
为了解决 Zanna 关于为什么第一个外壳确实被着色的评论,我相信这是原因:
当 bash 作为交互式登录 shell 被调用时。. . 它首先从文件 /etc/profile 中读取并执行命令,如果该文件存在的话。读取该文件后,它会按顺序查找 ~/.bash_profile、~/.bash_login 和 ~/.profile,并从第一个 存在且可读的命令中读取和执行命令。(来自 bash 手册页,强调了添加)
发生的事情是,一旦您登录,就会bash找到~/.bash_profile它并将其作为找到的第一个文件。其他 shell 是交互式非登录 shell,因此仅 ~/.bashrc在此之后进行采购。
| 归档时间: |
|
| 查看次数: |
673 次 |
| 最近记录: |