How-to: Prompt Statement variables

There are several variables that can be set to control the appearance of the bash command prompt: PS1, PS2, PS3, PS4 and PROMPT_COMMAND the contents are executed just as if they had been typed on the command line.

PS1 – Default interactive prompt (this is the variable most often customized)
PS2 – Continuation interactive prompt (when a long command is broken up with \ at the end of the line) default=">"
PS3 – Prompt used by “select” loop inside a shell script
PS4 – Prompt used when a shell script is executed in debug mode (“set -x” will turn this on) default ="++"
PROMPT_COMMAND - If this variable is set and has a non-null value, then it will be executed just before the PS1 variable.

Set your prompt by changing the value of the PS1 environment variable, as follows:

$ export PS1='My simple prompt$ '
My simple prompt$

It is recommended not to use a '>' in your PS1 Command Prompt as if copy/pasted by accident that can cause a redirection and file overwrite.

This change can be made permanent by placing the export PS1 definition in your startup file.

Special prompt variable characters:

 \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.

 \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 (typically a color code). 
 \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.

Using single quotes instead of double quotes when exporting your PS variables is recommended, it makes the prompt a tiny bit faster to evaluate.

Command/History Numbers

The command number and the history number are usually different: the history number of a command is its position in the history list, which may include commands restored from the history file, while the command number is the position in the sequence of commands executed.

After the string is decoded, it is expanded via parameter expansion, command substitution, arithmetic expansion, and quote removal, subject to the value of the promptvars shell option.

Color Codes (ANSI Escape Sequences)

Foreground colors, Normal (non-bold) is the default, so the 0; prefix is optional.

\e[0;30m = Dark Gray
\e[1;30m = Bold Dark Gray
\e[0;31m = Red
\e[1;31m = Bold Red
\e[0;32m = Green
\e[1;32m = Bold Green
\e[0;33m = Yellow
\e[1;33m = Bold Yellow
\e[0;34m = Blue
\e[1;34m = Bold Blue
\e[0;35m = Purple
\e[1;35m = Bold Purple
\e[0;36m = Turquoise
\e[1;36m = Bold Turquoise
\e[0;37m = Light Gray
\e[1;37m = Bold Light Gray

Background colors:

\e[40m = Dark Gray
\e[41m = Red
\e[42m = Green
\e[43m = Yellow
\e[44m = Blue
\e[45m = Purple
\e[46m = Turquoise
\e[47m = Light Gray

An alternative, more portable and more intuitive method of setting colors is to use tput, this will read the terminfo database with all the escape codes necessary for interacting with your terminal.
If you use tput instead of hard-coding the escape sequences, you can set the TERM variable to control whether color codes are output. This also makes the output portable to terminals other than xterm.


Set a prompt like: hostname:~/CurrentWorkingDirectory$

export PS1='\h:\w\$ '

Set a prompt like: [username@hostname:~/CurrentWorkingDirectory]$

export PS1='[\u@\h:\w]\$ '

Set a prompt like [username@hostname:~/CurrentWorkingDirectory]$
With the foreground color red, note the escapes for the non printing characters [ ] become \[ and \], these ensure that readline can keep track of the cursor position correctly. The \e0m at the end resets the color back to default.

export PS1='\[\e[31m\]\u@\h:\w\[\e[0m\] '

Set a prompt like [username@hostname:~/CurrentWorkingDirectory]$ with the foreground and background colors, set via tput:

magenta=$(tput setaf 5)
blue=$(tput setaf 4)
reset=$(tput sgr0)
export PS1='[\[$magenta\]\u\[$reset\]@\[$magenta\]\h\[$reset\]:\[$blue\]\w\[$reset\]]\\$ '

Restore the default macOS Prompt:

(Hostname:CurrentWorkingDirectory Username$)
PS1='\h:\W \u\$'

“There is a time for departure even when there’s no certain place to go” ~ Tennessee Williams

Related macOS commands

env - Display, set, or remove environment variables.
- Set an environment variable.
Bash $PS1 generator - Generate a custom colorful bash prompt. (tput codes).
Windows equivalent: PROMPT - Change the command prompt.

Copyright © 1999-2024
Some rights reserved