228

Currently it is:

michael@Castle2012-Ubuntu-laptop01:~/Dropnot/webs/rails_v3/linker/spec/controllers$

Outside of renaming my machine and directory structure...

How could I make it be something more like:

michael:controllers$
1

7 Answers 7

315

To change it for the current terminal instance only

Just enter PS1='\u:\W\$ ' and press enter.


To change it "permanently"

In your ~/.bashrc, find the following section:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi

Remove the @\h, and replace the \w with an uppercase \W, so that it becomes:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u\[\033[00m\]:\[\033[01;34m\]\W\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u:\W\$ '
fi

Save, exit, close terminal and start another to see the result.


Tons more options!

  • See here for a more extensive howto, with many more options
  • See this answer for using up a tiny Python script to set the prompt so that the shortening only occurs when you are deep in a directory structure.
11
  • 1
    You can also have a lot of information... and then a carriage return at the end as in unix.stackexchange.com/q/88780/10043 May 23, 2014 at 22:18
  • Is there a way to make this global? In other words, if I sudo to another user, have this setting carry over, but only for myself (i.e., not for the user when they normally use their account)?
    – ctote
    May 14, 2015 at 16:20
  • In order to have a shared .bashrc that works on both Linux and OSX I've since switched to unix.stackexchange.com/a/127800/10043 May 19, 2015 at 12:40
  • i.e. HOST='\033[02;36m\]\h' HOST=' '$HOST parse_git_branch () { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'; } TIME='\033[01;31m\]\t \033[01;32m\]' LOCATION=' \033[01;34m\]pwd | sed "s#(/[^/]\{1,\}/[^/]\{1,\}/[^/]\{1,\}/).*(/[^/]\{1,\}/[^/]\{1,\})/\{0,1\}#\1_\2#g"' BRANCH=' \033[00;33m\]$(parse_git_branch)\[\033[00m\]\n\$ ' PS1=$TIME$USER$HOST$LOCATION$BRANCH PS2='\[\033[01;36m\]>' May 19, 2015 at 12:44
  • but see the answer for actual code to use. May 19, 2015 at 12:44
158

Run this code in the current terminal

PROMPT_DIRTRIM=3

Now the bash prompt will show only the last 3 directory names. You can choose 1 to show only current directory. More information is available in the GNU documentation.

The effect:

/var/lib/apt/lists# PROMPT_DIRTRIM=3
/.../lib/apt/lists# 

If you want to make it permanently, add the following line to ~/.bashrc in the beginning:

PROMPT_DIRTRIM=3

or another number greater than zero.

3
  • 8
    Just a sidenote: This requires Bash 4. Jun 18, 2014 at 0:12
  • 1
    Nice... I added a bach_alias for this (with a function) promptdir() { PROMPT_DIRTRIM=$1; } just to make live easier...
    – dgoosens
    Aug 17, 2018 at 0:10
  • 1
    Is there way to trim intermediate directory only i.e. keep the first directory and last directory ? e.g. /var/.../lists# Aug 23, 2020 at 17:26
27

This is my preferred prompt setting:

added in ~/.bashrc

PS1='[\u@\h \W]\$ '    

it looks like this:

[user@hostname dirname]$

(with a space after the $ sign)

2
  • How about this PS1='\[\033[01;34m\][\u @ \h \W]\[\033[00m\]\$ ', but adding space between each word looks ugly tho... Sep 17, 2021 at 2:06
  • very useful, thanks a lot!
    – Siwei
    yesterday
8

Personally I prefer to see only current folder in the bash prompt. I can do this with the following command:

PS1='\W\$ '

If you want it to take effect after each start then add the above command into your ~/.bashrc.

3

I realize this is super old but since nobody suggested creating an alias I figured I'd post. Using Bash Prompt Escape Sequences I made an alias shorten

In ~/.bash_aliases here you will notice the $Blue var to set the prompt colour which you can omit or change based on preference I also clear the terminal when calling shorten.

alias c='clear'

alias shorten='PS1="$Blue$USER:\W$ "&& c'

To achieve the OP's desired prompt string:

alias shorten='PS1="$USER:\W$ "'

I have colours defined in ~/.bashrccopy and pasted from https://wiki.archlinux.org/index.php/Color_Bash_Prompt. On a side note what's with ansi code colours? I'm confused just looking at it.

Blue='\e[0;34m'         # Blue
2
  • A step by step guide for this would be so useful as I have no idea how to get to .bash_aliases. Thanks
    – Kayote
    Feb 2, 2016 at 10:26
  • 2
    "." prefix indicates a hidden directory or file. The tilde "~" is short form of $HOME variable. So, "~/.bash_aliases" is just short form of "/home/$USER/.bash_aliases". To open ".bash_aliases" you can either open a terminal and type "gedit /home/$USER/.bash_aliases" or "gedit ~/.bash_aliases" or in your home directory type ctrl-h to show hidden files and open file directly. Hope that helps. You may want to do a Google search for useful aliases as well. Feb 3, 2016 at 17:46
2

I wrote a function you can modify to suit your needs:

function termprompt() {
    PS1="${PS1//@\\h/}"     # Remove @host
    PS1="${PS1//\\w/\\W}"   # Change from full directory to last name
}

Place this function at or near the bottom of ~/.bashrc after the PS1 line has been fully computed.

You would type termprompt whenever you wanted to shorten your prompt or, have termprompt called from the bottom of your ~/.bashrc for permanency.

The advantage of this technique over many other answers is .bashrc can setup PS1 in four different ways (xterm+no-color, xterm+color, no-xterm+no-color, no-xterm+color). This answer supports all four current methods and probably future methods too.

Another advantage is this method has less complex control codes to traverse over in order to insert your changes.

1

Noting the answers I found in this post I came up with a template that I prefer to use. I also include colors in the command.

it looks like this:

[ folder ]$ Command

To test it for the current terminal instance

PS1='\[\033[01;34m\][ \W ]\[\033[00m\]$ '

To make it permanent for every terminal instance

echo "PS1='\[\033[01;34m\][ \W ]\[\033[00m\]\$ '" >> ~/.bashrc

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.