Bash prompt with the last exit code
As you are starting to border on a complex PS1, you might consider using PROMPT_COMMAND
. With this, you set it to a function, and it will be run after each command to generate the prompt.
You could try the following in your ~/.bashrc
file:
PROMPT_COMMAND=__prompt_command # Function to generate 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}"}
This should do what it sounds like you want. Take a look a my bashrc's sub file if you want to see all the things I do with my __prompt_command
function.
If you don't want to use the prompt command there are two things you need to take into account:
- getting the value of
$?
before anything else. Otherwise it'll be overridden. - escaping all the
$
's in the PS1 (so it's not evaluated when you assign it)
Working example using a variable
PS1="\$(VALU="\$?" ; echo \$VALU ; date ; if [ \$VALU == 0 ]; then echo zero; else echo nonzero; fi) "
Working example without a variable
Here the if needs to be the first thing, before any command that would override the $?
.
PS1="\$(if [ \$? == 0 ]; then echo zero; else echo nonzero; fi) "
Notice how the \$()
is escaped so it's not executed right away, but each time PS1 is used. Also all the uses of \$?
.
I wanted to keep default Debian colors, print the exact code, and only print it on failure:
# 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}