Shorter Bash Prompts

4 September 2009

I use Java a lot, and the common practice of naming java packages with long URI-derived namespaces often leads to my bash prompt becoming extremely long. Here’s a script to display an abbreviated path on the bash prompt.


The prompt definitions and script below will display a shortened string derived from the path by taking the first letter from each path segment, and the last segment in its entirity.

For example, the following terminal prompt inside a hypothetical Eclipse plugin I might be developing:

michael@kothar ~/dev/workspace/net.kothar.shiny/src/net/kothar/shiny/actions$

would be abbreviated as:

michael@kothar ~/d/w/n/s/n/k/s/actions$

To most that probably doesn’t mean much, but I think most developers have a good idea what’s in their directory structures, and can probably work out pretty quickly where they are. There’s always a call to the trusty pwd command if you are feeling lost. In some projects I have at work, the package names are even longer, so the reduced amount of text to parse is quite welcome.

Here’s what you need:

New prompt definition (with colours):

PS1="${debian_chroot:+($debian_chroot)}\[\033[00;32m\]\u@\h\[\033[00m\]:\[\033[00;34m\]\$(shortpath)\[\033[00m\]\$ "

Or more simply (without colours):

PS1="\$(shortpath)\$ "

shortpath:

#!/usr/bin/perl  

use Cwd;  
my $path = &Cwd::cwd();  

# Replace the 'home' segment with a tilde  
$path =~ s/^$ENV{'HOME'}/~/;  

my @segments = split(/\//, $path);  

my $shortpath = "";  
while (my $segment = shift @segments) {  
	if (@segments) {  
		$shortpath .= substr ($segment, 0, 1) . "/";  
	}  
	else {  
		$shortpath .= "$segment";  
	}  
}  
print $shortpath;