Best bash prompt. Ever.

January 6th, 2009

I have the best bash prompt ever. It took a lot of hacking and googling, but here she is:

Notice that the smiley face and text colors change depending on the exit code of the last run command (red = failed, green = happy). This is handy, for example, after a big long build that has error messages buried in it, and the last line of output just isn’t that useful.

To make your prompt awesome, put this in your .bashrc and enjoy:

Happy bashing!

10 Responses to “Best bash prompt. Ever.”

  1. Hans Says:

    Does your version of bash handle the wrapping ok when you do this? I used to have color on my input line and finally gave up. My current prompt is this:

    $(r=$?; [ 0 == $r ] || echo "\[\e[0;33m\]$r\[\e[0m\] ")\u@\h \[\e[0;32m\]\w\[\e[0m\]\n\$

    This gives me a little color, which makes finding previous prompts easy when scrolling up, and the return status is there in yellow if it’s not 0. But no color on the actual input line, and also the longest input line possible, and so I have minimal issues with different versions of bash and their myriad wrapping bugs.

  2. Dave Says:

    Yeah, my bash does handle the wrapping. However, if yours does not, you can just put all that “export PS1″ stuff on a single line.

  3. Evan Farrer Says:

    For users of git I recommend a slight modification. This adds the current git branch when you’re in a git controlled directory. It’s not as elegant (multiple echo’s) but more awesome.

    export PS1="\`if [ \$? = 0 ];
                  then
                      echo -en '$GREEN--( $LIGHT_CYAN\u$YELLOW@$LIGHT_CYAN\h$GREEN )--( $YELLOW\w$GREEN )--( $PURPLE'; __git_ps1 "%s"; echo -n '$GREEN )-- :)\n--\$$DEFAULT_COLOR ';
                  else
                      echo -en '$LIGHT_RED--( $LIGHT_CYAN\u$YELLOW@$LIGHT_CYAN\h$LIGHT_RED )--( $YELLOW\w$LIGHT_RED )--( $PURPLE'; __git_ps1 "%s"; echo -n '$LIGHT_RED )-- :         (\n--\$$DEFAULT_COLOR ';
                  fi; \`" 
    
  4. Jamie Smith Says:

    I would like to prompt your bash.

  5. Bonta-Kun Says:

    It’s not so bad, especially the coloring by exit-code.

    However, you might want to do something like: user@host:cwd (that is, put the current directory next to the host). Then you can use the whole string as an ssh/scp target/source…

    Also, coloring the username differently depending on being root or not can really save you :)

  6. Kathryn Says:

    This is great, totally using it. :)

  7. Tobias Says:

    Saw it, used it (with modifications), love it. Bonta-kun’s suggestion is great.

  8. Ice Says:

    Great tip, thanks. I love your blog!

    I’m using it with some modifications (root in red, full path, shows svn revision):

    export PS1='`if [ \\$? = 0 ];
        then
            echo -e "33[0m[$(test \u = root && echo 33[31mroot33[0m || echo \u)@\h $(pwd) $(svn info 2>&1 | grep Revision &> /dev/null && (echo -n "33[1;34m" ; echo -n $(svn info | grep Revision:) ; echo -n "33[0m"))]33[32m\$33[0m ";
        else
            echo -e "33[0m[$(test \u = root && echo 33[31mroot33[0m || echo \u)@\h $(pwd) $(svn info 2>&1 | grep Revision &> /dev/null && (echo -n "33[1;34m" ; echo -n $(svn info | grep Revision:) ; echo -n "33[0m"))]33[31m\$33[0m ";
        fi; `'
    
  9. William Dye ("willdye") Says:

    For what it’s worth, I tend to avoid using the ASCII escape codes directly, preferring code such as “blue=$(tput setaf 4 2) instead. According to http://mywiki.wooledge.org/BashFAQ/037 and http://bash-hackers.org/wiki/doku.php?id=scripting:terminalcodes the tput method is preferred, though I can’t think of an instance in which either method caused a serious problem for me.

  10. TheBonsai Says:

    @willdye

    For the specific ANSI codes, there is no real technical reason. tput setaf/setab produce ANSI codes per definition (setaf – “set ANSI foreground”).

    It gets interesting for all other codes that are not ANSI specific or defined in ANSI but may be implemented differently in your terminal (maybe a better version of it, or similar). What tput improves is the code readability, even for ANSI color codes. Direct ESC sequences look crazy in the code, compared to a $(tput ….).

Leave a Reply