8

I can't remember where, but I've already seen the bash prompt's current path shortened in an interesting way: every directory contained in the path (excepted the last one) is replaced by its first letter only. For instance: path/to/some/directory would be shortened to p/t/s/directory.

How can I reproduce that behavior ?

  • You can't directly do this in PS1. You would need to set PS1 to contain a variable (PS1='${SHORT_PWD}\\$') and update that variable in $PROMPT_COMMAND. – Gilles Mar 8 '13 at 1:30
7

After playing with this for a while I got the answer you require:

Add this to your .bashrc file in your home directory, exit the terminal and renter it and you will get you prompt.

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/([^/]{,2})[^/]*|/\1|g'
}

It uses the declared function sps() to evaluate the path every time the variable PS1 which is the prompt, is displayed

ie

/ho/de/De/Ap/Ti$ pwd
/home/deth/Desktop/Apps/Tivo
/ho/de/De/Ap/Ti$ 

Or...if you insist on the one letter

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/(.)[^/]*|/\1|g'
}

Which displays:

/h/d/D/A/T$ pwd
/home/deth/Desktop/Apps/Tivo
/h/d/D/A/T$ 
  • Thanks Meer. My prompt is actually removing the user@pc part. How can I handle this? – Alex Dec 28 '15 at 9:18
2

To truncate all directory names except the last one:

PS1='$(eval "sps")$ '                                                                                
sps() {                                                                                              
    python -c "import sys; dirs = sys.argv[1].split('/'); print '/'.join(d[:1] for d in dirs[:-1]) + '/' + dirs[-1]" $PWD
}
  • This doesn't work when I change the directories? – Aditya Varma Sep 7 '17 at 6:16
2

Best answer (Meer Borg's) regex breaks for one letter directories, like that:

echo "/home/user/x/next_dir/other_dir" | sed -r 's|/(..)[^/]*|/\1|g'
/ho/us/x//ot

The correct function would be:

PS1='$(eval "sps")$ '
sps() {
   echo "$PWD" | sed -r 's|/([^/]{,2})[^/]*|/\1|g'
}

Sorry don't have reputation to comment under the original answer, lol

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.