将 2 个提示合并为一个,以红色/橙色显示错误情况

将 2 个提示合并为一个,以红色/橙色显示错误情况

和大家一样,我有一个定制的提示。我的 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_Insidebad设置为空,因此提示中不会显示任何内容。

                bad='';
                echo \"$PS1_Inside\";
        fi;

最后,取消设置辅助变量,以免使环境混乱。

unset PS1_Error PS1_Normal PS1_Inside

相关内容