![将 2 个提示合并为一个,以红色/橙色显示错误情况](https://linux22.com/image/63353/%E5%B0%86%202%20%E4%B8%AA%E6%8F%90%E7%A4%BA%E5%90%88%E5%B9%B6%E4%B8%BA%E4%B8%80%E4%B8%AA%EF%BC%8C%E4%BB%A5%E7%BA%A2%E8%89%B2%2F%E6%A9%99%E8%89%B2%E6%98%BE%E7%A4%BA%E9%94%99%E8%AF%AF%E6%83%85%E5%86%B5.png)
和大家一样,我有一个定制的提示。我的 root 用户变成红色,普通用户变成绿色,还有一些其他小事情:
在bash.bashrc
:
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '
在.bashrc
:
PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
导致:
\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$
对于普通用户...
这大约是我对提示的最大能力,但是一位真正的高级管理员与我分享了他/她/它的提示:
PS1_Error="\[\033[31;1m\]"
PS1_Normal="\[\033[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '
PS1="\`
retcode=\$? ;
if [ 0 -ne \$retcode ]; then
bad=\" [\\\\\\\$?=\$retcode]\"
echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
else
bad='';
echo \"$PS1_Inside\";
fi;
\`"
unset PS1_Error PS1_Normal PS1_Inside
它具有因错误而变红的神奇能力显示错误号!
因为我太笨了甚至无法理解这是如何运作的(所需的变量未设置???),我绝对太笨了,无法将其合并到我的变量中(并且我想要橙色表示错误条件......)
由于高级管理员是一个非常忙碌的男人/女孩/中性人,我在 U&L 上询问是否有人理解上述内容并想教我如何钓鱼而不是授我鱼?帮我把美好的事物融入PS1
愚蠢的事物中,并解释一下这里发生了什么?
答案1
这些变量描述提示本身:
PS1_Error="\[\033[31;1m\]"
PS1_Normal="\[\033[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '
颜色是使用完成的ANSI 转义码。\033
是转义字符(八进制33 = 27),然后[31;1m
设置文本颜色31和效果1。[0m
设置效果0,即全部默认。注意如何PS1_Inside
在单身的引号 ( ''
) 表示此步骤不执行变量替换。 (稍后会发生。)
真正的魔法发生在这里:
PS1="\`
...
\`"
这将 PS1 设置为执行代码内的输出``
。无论出现什么结果都会发生变量扩展。代码将运行每次出现提示时。代码本身的运行方式如下:
retcode=\$? ;
$?
包含上一个命令的结果。零表示正常,其他任何情况都是失败条件。这个retcode
暂时保存在里面。一切都需要转义,因为我们希望变量在代码运行时被访问,而不是在定义时被替换。
if [ 0 -ne \$retcode ]; then
如果它不为零,则表示出了问题。因此,我们回显用于错误的提示样式。上面bad
使用的是PS1_Inside
.PS1_Error
用于改变颜色,PS1_Normal
用于将颜色变回正常。
bad=\" [\\\\\\\$?=\$retcode]\"
echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
else
在这种情况下,没有发生错误,所以我们不做任何颜色,只输出PS1_Inside
。bad
设置为空,因此提示中不会显示任何内容。
bad='';
echo \"$PS1_Inside\";
fi;
最后,取消设置辅助变量,以免使环境混乱。
unset PS1_Error PS1_Normal PS1_Inside