Update your bash prompt to give each hostname a different color
I SSH in to many different computers all day, and sometimes I get confused by what machine I’m on. I was thinking about assigning a different color in my bash prompt for each machine, but I thought that would get tiresome coming up with a new color for each new box that I had to log in to. I mentioned this in the Chicago Tech Slack and Josh Symonds suggested “Some prompts do some hashing on hostnames to turn the prompt a different color based on that.”
So that’s what I did. My bash prompt already has the hostname in the prompt, so I updated it to give it a different color for each hostname, based on hashing the hostname. It looks like this.
Now, each of the three hosts parker
, clifford
and alex
have a
different color, which can help give a visual cue if something’s wrong.
I’m a big believer in using color to help in orienting. The best demonstration I had was when I accidentally walked into the women’s bathroom at work. I just stood there in the doorway thinking “Wait, what’s wrong?” I couldn’t identify it for a few seconds, but I knew something was wrong. Then it clicked: The wallpaper was a different color than I was used to.
Here’s how I did the magic with the prompt.
local EXIT="$?" # Stash the exit status for later.
# List of color variables that bash can use
local BLACK="\[\033[0;30m\]" # Black
local DGREY="\[\033[1;30m\]" # Dark Gray
local RED="\[\033[0;31m\]" # Red
local LRED="\[\033[1;31m\]" # Light Red
local GREEN="\[\033[0;32m\]" # Green
local LGREEN="\[\033[1;32m\]" # Light Green
local YELLOW="\[\033[0;33m\]" # Yellow
local LYELLOW="\[\033[1;33m\]" # Light Yellow
local BLUE="\[\033[0;34m\]" # Blue
local LBLUE="\[\033[1;34m\]" # Light Blue
local PURPLE="\[\033[0;35m\]" # Purple
local LPURPLE="\[\033[1;35m\]" # Light Purple
local CYAN="\[\033[0;36m\]" # Cyan
local LCYAN="\[\033[1;36m\]" # Light Cyan
local LGREY="\[\033[0;37m\]" # Light Gray
local WHITE="\[\033[1;37m\]" # White
local RESET="\[\033[0m\]" # Color reset
local BOLD="\[\033[;1m\]" # Bold
# Base prompt
local CNAME=$(hostname -s)
local CNAME_MD5
if [ "${OSTYPE:0:6}" == 'darwin' ] ; then
CNAME_MD5=$(hostname -s | md5)
else
CNAME_MD5=$(hostname -s | md5sum)
fi
local RDEC=$((16#${CNAME_MD5:0:2}))
local GDEC=$((16#${CNAME_MD5:2:2}))
local BDEC=$((16#${CNAME_MD5:4:2}))
PS1="\[\e[38;2;${RDEC};${GDEC};${BDEC}m\]$CNAME:$YELLOW\w$CYAN "
if [ "$EXIT" != 0 ]; then
PS1+="${LRED}\\\$ $RESET"
else
PS1+="${LGREEN}\\\$ $RESET"
fi
There’s other stuff in my prompt setup to show the status of the Subversion or Git project I’m working on, too.
I hope someone finds this useful. Drop me an email at andy@petdance.com with any suggestions on improvements.