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

Fab*_*bby 5 bash prompt

和大家一样,我有一个定制的提示。我的 root 变红,普通用户变绿,还有其他一些小事:

bash.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$ '
Run Code Online (Sandbox Code Playgroud)

.bashrc

PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1"
Run Code Online (Sandbox Code Playgroud)

导致:

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\n\$
Run Code Online (Sandbox Code Playgroud)

对于普通用户...

这大约是我在提示方面的最大能力,但一个真正的高级管理员与我分享了他/她/它的提示:

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
Run Code Online (Sandbox Code Playgroud)

它具有在错误时变成红色并显示错误编号的奇妙能力!

因为我太笨了,甚至无法理解它是如何工作的(需要的变量未设置???),我绝对太笨了,无法将它合并到我的(我想要橙色来表示错误条件......)

由于高级管理员是一个非常忙碌的男/女/中性,我在 U&L 上问这里是否有人理解上述内容并想教我如何钓鱼而不是给我一条鱼?帮我把好的PS1融入愚蠢的并解释一下这里发生了什么?

mar*_*nus 5

这些变量描述了提示本身:

PS1_Error="\[\033[31;1m\]"
PS1_Normal="\[\033[0m\]"
PS1_Inside='${debian_chroot:+($debian_chroot)}\u@\h:\w$bad\$ '
Run Code Online (Sandbox Code Playgroud)

颜色是使用ANSI 转义码完成的\033是转义字符(33 = 27 八进制),然后[31;1m设置文本颜色 31 和效果 1。[0m设置效果 0,即全部默认。注意 howPS1_Inside引号 ( '') 中,这意味着在此步骤中不执行变量替换。(稍后会发生。)

真正的魔法发生在这里:

PS1="\`
         ...
\`"
Run Code Online (Sandbox Code Playgroud)

这将 PS1 设置为在``字符内执行代码的输出。无论出现什么,都会发生可变膨胀。每次显示提示时,代码都会运行。代码本身运行如下:

        retcode=\$? ;
Run Code Online (Sandbox Code Playgroud)

$?包含上一个命令的结果。零表示正常,其他任何情况都是失败条件。这个retcode暂时保存。一切都需要转义,因为我们希望在代码运行时访问变量,而不是在定义时替换。

        if [ 0 -ne \$retcode ]; then
Run Code Online (Sandbox Code Playgroud)

如果它不为零,则出现问题。所以我们回显用于错误的提示样式。badPS1_Inside上面使用。PS1_Error用于改变颜色,PS1_Normal用于将颜色恢复正常。

                bad=\" [\\\\\\\$?=\$retcode]\"
                echo \"$PS1_Error$PS1_Inside$PS1_Normal\"
        else
Run Code Online (Sandbox Code Playgroud)

在这种情况下,没有发生错误,所以我们不做任何颜色,只输出PS1_Inside. bad设置为空,因此提示中不会显示任何内容。

                bad='';
                echo \"$PS1_Inside\";
        fi;
Run Code Online (Sandbox Code Playgroud)

最后,未设置辅助变量以免弄乱环境。

unset PS1_Error PS1_Normal PS1_Inside
Run Code Online (Sandbox Code Playgroud)