9

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 'SO- stop being evil' Mar 8 '13 at 1:30
  • @Gilles 'SO- stop being evil' sure you can do it directly, if you use double quote you need to backslash \$() command substitutions though – bac0n Oct 29 '19 at 7:07
8

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$ 
| improve this answer | |
  • Thanks Meer. My prompt is actually removing the user@pc part. How can I handle this? – Alex Dec 28 '15 at 9:18
3

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
}
| improve this answer | |
  • This doesn't work when I change the directories? – Aditya Varma Sep 7 '17 at 6:16
1

shorten all names except the last one without python:

user:/h/u/D/C/current$ 
sps() {
    echo `dirname $PWD` | sed -r 's|/(.)[^/]*|/\1|g'
}
PS1='\u:$$(eval "sps")/\W\$ '
| improve this answer | |

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.