和大家一样,我有一个定制的提示。我的 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