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
函数做的所有事情。
如果你不想使用提示命令,你需要考虑两件事情:
- 得到$的价值? 在别的之前,否则它会被覆盖
- 转义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