假设我在 .bash_profile 中定义了一个环境变量,如下所示:
PS1='\[\e[31;1m\][\u@\h \T \w] \[\e[0m\]'
这个变量使我的 Linux 提示符显示某些信息,例如:
[jeff@node21 01:48:30 ~]
[jeff@node22 01:48:30 ~]
[jeff@node23 01:48:30 ~]
[jeff@master 01:48:30 ~]
当“master”这个词出现时,我想将其大写(我不会在该节点上做任何工作,并且当我忘记在rsh
其他节点上做任何工作时,我希望它能够脱颖而出)。
我不能sed
在变量上使用PS1
,因为它不包含“master”一词。
最终,我希望当我在节点“master”上时提示符大写。有没有办法评估变量“PS1”,操作字符串,然后重新分配它以便提示起作用?
答案1
假设您使用的是最新版本的bash
,您可以通过PROMPT_COMMAND
使用变量 inPS1
而不是 来完成此操作\h
:
PROMPT_COMMAND='
myhost=$(hostname)
if [[ $myhost == master ]]; then
myhost=${myhost^^}
fi
'
PS1='\[\e[31;1m\][\u@$myhost \T \w] \[\e[0m\]'
PROMPT_COMMAND
在写入每个提示之前都会运行其中的任何内容。上述定义设置myhost
为 的输出hostname
,并且如果myhost
是掌握,它通过${var^^}
扩展而变为大写。
答案2
另一种方法是
PS1='\[\e[31;1m\][\u@$(hostname | perl -pe "\$_ = uc if m/master/") \T \w] \[\e[0m\]'
我承认我的建议不像雷神那样结构良好,但基本上很高兴知道这一点
$(cmd)
是命令替换的语法,就像通常在bash
.
还有一个不错的如何它只处理 bash 提示符的配置。这绝对值得一读。