Bash prompt with the last exit code Bash prompt with the last exit code bash bash

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:

  1. getting the value of $? before anything else. Otherwise it'll be overridden.
  2. 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}