The default PS1 variable on my machine (Kubuntu 13.10) is this:

\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$

I'm looking for a reference for how the $PS1 variable works that, at a minimum, allows me to understand the above PS1 variable.

  • @RaduRădeanu I've moved it out to a separate answer now. – Mark Raymond Jan 15 '14 at 8:47
  • As a general note, you can play around with this by setting the value of PS1 in a terminal, e.g. PS1="How r u, \u?". The change will only last until you close the terminal. – djvg Oct 23 '18 at 13:21
  • Related: askubuntu.com/a/984073/301745 – wjandrea Feb 20 at 23:54


So far, there hasn't been a single reference for everything that can go in a Bash prompt - but as it's a feature that has evolved over decades and probably varies from distro to distro, maybe that's too much to ask. I've tried to summarise what I found most useful here.

This how-to is the most complete, but is very long and rambling. Some of the more useful sections:

  • Section 2.4 and 2.5 explain the basics of setting PS1, including the (printable) escape characters.
  • Section 3.4 explains why \[ and \] are necessary.
  • Section 6 explains all the main (non-printable) escape sequences you might want to use, including setting the colour of the prompt and the title of an xterm window.

This guide explains how ${} works in Bash in general, and this Ask Ubuntu question explains a bit more about how that works with debian_chroot.

Between those, I think every character in the default Ubuntu PS1 variable is explained.

Explanation of the Ubuntu prompt

There are three parts to the prompt:

  • \[\e]0;\u@\h: \w\a\] sets the title bar of an xterm window:

    • \[ starts a section of non-printable characters
    • \e]0; is the escape sequence for 'set xterm title' (I believe numbers other than 0 will set other xterm properties, though I haven't tested this)
    • \u@\h: \w the title to use (see below for \u, \h and \w)
    • \a marks the end of the title
    • \] marks the end of non-printable characters
  • ${debian_chroot:+($debian_chroot)} expands to the value of $debian_chroot in parentheses if $debian_chroot is set. See this question for more information about $debian_chroot.
  • \u@\h:\w\$ is the prompt itself:

    • \u expands to the current username
    • \h expands to the current hostname
    • \w expands to the current working directory
    • \$ expands to # for root and $ for all other users

According with Bash Reference Manual, PS1 is:

The primary prompt string. The default value is \s-\v\$. See Controlling a Prompt, for the complete list of escape sequences that are expanded before PS1 is displayed.

Some others good references can be:


ss64.com seems to have the best reference I've found.

It explains the following variables:

\d   The date, in "Weekday Month Date" format (e.g., "Tue May 26"). 

\h   The hostname, up to the first . (e.g. deckard) 
\H   The hostname. (e.g. deckard.SS64.com)

\j   The number of jobs currently managed by the shell. 

\l   The basename of the shell's terminal device name. 

\s   The name of the shell, the basename of $0 (the portion following 
    the final slash). 

\t   The time, in 24-hour HH:MM:SS format. 
\T   The time, in 12-hour HH:MM:SS format. 
\@   The time, in 12-hour am/pm format. 

\u   The username of the current user. 

\v   The version of Bash (e.g., 2.00) 

\V   The release of Bash, version + patchlevel (e.g., 2.00.0) 

\w   The current working directory. 
\W   The basename of $PWD. 

\!   The history number of this command. 
\#   The command number of this command. 

\$   If you are not root, inserts a "$"; if you are root, you get a "#"  (root uid = 0) 

\nnn   The character whose ASCII code is the octal value nnn. 

\n   A newline. 
\r   A carriage return. 
\e   An escape character. 
\a   A bell character.
\\   A backslash. 

\[   Begin a sequence of non-printing characters. (like color escape sequences). This
     allows bash to calculate word wrapping correctly.

\]   End a sequence of non-printing characters.

The \[ ... \] defines a series of non-printing characters. They are required to keep track of the cursor position correctly.

The \e in your prompt starts an escape sequence. More on those here (note "Esc" on that page is the \e sequence).

  • Note: I've never really liked escape sequences. Use tput to get the escape code for you.

${debian_chroot:+($debian_chroot)} is parameter expansion. See here

  • It writes ($debian_chroot) if $debian_chroot is set otherwise nothing.

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.