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.