Bash提示最后退出代码

所以,我一直试图通过bash提示符自定义,以便它看起来像

[feralin@localhost ~]$ _ 

与颜色。 我设法得到恒定的颜色(每次看到提示时都是相同的颜色),但是如果最后一个命令的非零退出状态,我希望用户名('feralin')显示为红色,而不是绿色。 我想出了:

 \e[1;33m[$(if [[ $? == 0 ]]; then echo "\e[0;31m"; else echo "\e[0;32m"; fi)\u\e[m@\e[1;34m\h \e[0;35m\W\e[1;33m]$ \e[m 

然而,根据我的观察, $(if ...; fi)似乎只运行一次,运行.bashrc时,结果会被永久replace。 这使名称始终为绿色,即使最后一个退出代码不为零(如echo $? )。 这是怎么回事? 或者是我的提示只是其他问题吗? 长问题简短, 我如何得到我的提示使用最后的退出代码?

当你开始在一个复杂的PS1边界,你可能会考虑使用PROMPT_COMMAND
用这个,把它设置成一个函数,并且在每个命令之后运行它来产生提示。

你可以在你的~/.bashrc试试以下内容

 PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs __prompt_command() { local EXIT="$?" # This needs to be first PS1="" local RCol='\[\e[0m\]' local Red='\[\e[0;31m\]' local Gre='\[\e[0;32m\]' local BYel='\[\e[1;33m\]' local BBlu='\[\e[1;34m\]' local Pur='\[\e[0;35m\]' if [ $EXIT != 0 ]; then PS1+="${Red}\u${RCol}" # Add red if exit code non 0 else PS1+="${Gre}\u${RCol}" fi PS1+="${RCol}@${BBlu}\h ${Pur}\W${BYel}$ ${RCol}" } 

这应该做你想要的线。 看看我的bashrc的子文件,如果你想看看我用__prompt_command函数做的所有事情。

如果你不想使用提示命令,你需要考虑两件事情:

  1. 得到$的价值? 在别的之前,否则它会被覆盖
  2. 转义PS1中的所有$(因此在分配时不进行评估)

使用variables的工作示例

 PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) " 

没有variables的工作示例

在这里,如果需要成为第一件事,那么在任何可以覆盖$?命令之前$?

 PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) " 

注意\$()是如何转义的,所以不会马上执行,而是每次使用PS1。 还有\$?所有用途\$?

我想保持默认的Debian颜色,打印确切的代码,并只在失败时打印:

 # Show exit status on failure. PROMPT_COMMAND=__prompt_command __prompt_command() { local curr_exit="$?" local BRed='\[\e[0;91m\]' local RCol='\[\e[0m\]' PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' if [ "$curr_exit" != 0 ]; then PS1="[${BRed}$curr_exit${RCol}]$PS1" fi } 

改进@demure

我认为这很重要,因为并不总是退出状态是0或1。

 if [ $EXIT != 0 ]; then PS1+="${Red}${EXIT}:\u${RCol}" # Add red if exit code != 0 else PS1+="${Gre}${EXIT}:\u${RCol}" # Also displays exit status fi