How to change the default shell prompt.

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux

Issue

  • How to change the default shell prompt.
  • How to change the shell prompt so that it will help to identify production systems.

Resolution

  • The shell prompt is controlled via the PS environment variables.
**PS1** - The value of this parameter is expanded and used as the primary prompt string. The default value is \u@\h \W\\$ .
**PS2** - The value of this parameter is expanded as with PS1 and used as the secondary prompt string. The default is ]
**PS3** - The value of this parameter is used as the prompt for the select command
**PS4** - The value of this parameter is expanded as with PS1 and the value is printed before each command bash displays during an execution trace. The first character of PS4 is replicated multiple times, as necessary, to indicate multiple levels of indirection. The default is +
  • PS1 is a primary prompt variable which holds \u@\h \W\\$ special bash characters. This is the default structure of the bash prompt and is displayed every time a user logs in using a terminal. These default values are set in the /etc/bashrc file.

  • The special characters in the default prompt are as follows:

\u = username
\h = hostname
\W = current working directory
  • This command will show the current value.
# echo $PS1
  • This can be modified by changing the PS1 variable:
# PS1='[[prod]\u@\h \W]\$'   
  • The modified shell prompt will look like:
[[prod]root@hostname ~]#
  • In order to make these settings permanent, edit the /etc/bashrc file:

Find this line:

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "

And change it as needed:

[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[[prod]\u@\h \W]\\$ "

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

6 Comments

This solution has simply "Red Hat Enterprise Linux" in the Environment section implying it applies to all versions of Red Hat Enterprise Linux.

Editing /etc/bashrc is against the advice of the comments in /etc/bashrc on Red Hat Enterprise Linux 7 which say

# It's NOT a good idea to change this file unless you know what you
# are doing. It's much better to create a custom.sh shell script in
# /etc/profile.d/ to make custom changes to your environment, as this
# will prevent the need for merging in future updates.

On RHEL 7 instead of the solution suggested above create a /etc/profile.d/custom.sh which contains

PS1="[[prod]\u@\h \W]\\$ "

Hello Red Hat community! I also found this useful:

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. 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 (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 plus you can then do an echo $PS1 to see the current prompt settings.

Also complementing you answer \d didn't match my needs for specifying the full date. So I share how I fixed it:

From man bash:

...
\D{format}
                     the format is passed to strftime(3) and the result is inserted into the prompt string; an empty format results in a locale-specific time representation.  The braces
                     are required
...

From man strftime:

...
       %a     The abbreviated name of the day of the week according to the current locale.  (Calculated from tm_wday.)
       %A     The full name of the day of the week according to the current locale.  (Calculated from tm_wday.)
       %b     The abbreviated month name according to the current locale.  (Calculated from tm_mon.)
       %B     The full month name according to the current locale.  (Calculated from tm_mon.)
       %c     The preferred date and time representation for the current locale.
       %C     The century number (year/100) as a 2-digit integer. (SU) (Calculated from tm_year.)
       %d     The day of the month as a decimal number (range 01 to 31).  (Calculated from tm_mday.)
...

For example:

PS1="[\D{%d/%m/%Y %H:%M:%S} \u@\h \W]$ "

Would look like:

[19/02/2020 19:14:03 linuxlab@linuxlab etc]$ 

This is cool, thanks. Do you know if there a way to get the namespace/project name in the prompt?

after making the changes, how to reload the bashrc file to take effect without server logoff and reboot. Also after every new login into the server set PS value is getting vanished.

I guess you have already figured it out. Just replying in case anyone else gets this informative.

Add the PS1 export in your ~/.bashrc file, like:

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

And, without logging out, just source the file to apply in your current login prompt:

source ~/.bashrc

I hope this helps!