Installation

It's a generalized scheme for all users, so you should start removing your ~/.bashrc file and then modify the /etc/bash.bashrc file and create a /etc/DIR_COLORS file (but ~/.bashrc and /etc/bash.bashrccan also cohabitate). Here is our possible version of this scheme for Arch (originally this scheme was created for Gentoo, but here are some important additions).

As you can see, the PS1 variable (i.e.: the prompt) is overwritten. So, if you had previously created a color prompt through the /etc/bash.bashrc file, each new user, to see it, should delete the line

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

from their ~/.bashrc. Accordingly, if you want to grant to new users to have the same colorfull PS1, you should delete that line from /etc/skel/.bashrc.

Example of cohabitation of /etc/bash.bashrc and ~/.bashrc

~/.bashrc and /etc/bash.bashrc can also cohabitate. Here is a possible example of a typical Arch user's ~/.bashrc file which can cohabit with the /etc/bash.bashrc file proposed here, valid for all users. The output will remain coloured.

Random quotations at logon

If you want a random quotation at logon (like Slackware) you must install Fortune. Fortune is a simple program that displays a pseudorandom message from a database of quotations at logon and/or logout. Type pacman -S fortune-mod to install it, then uncomment the following line from our/etc/bash.bashrc file:

# [[ "$PS1" ]] && /usr/bin/fortune

If you want to colorize (brown in this example) the random message from fortune, replace the previous commented text with:

Note:Some unicode symbols (like ✗ and ╼) are not well supported in some terminals (in linux console, for example), so this prompt will appear a bit different depending on where is displayed. If you want to know the unicode representation of a plain text, here you have a little plain text converter.

And finally here is the /etc/bash.bashrc file for this effect. If you want to get it you must replace the the following lines of our/etc/bash.bashrc file:

Note:Some unicode symbols (like ✗) are not well supported in some terminals (in linux console, for example), so this prompt will appear a bit different depending on where is displayed. If you want to know the unicode representation of a plain text, here you have a little plain text converter.

And finally here is the /etc/bash.bashrc file for this effect. If you want to get it you must replace the the following lines of our/etc/bash.bashrc file:

Restoring the original /etc/bash.bashrc file

If you repent having modified the /etc/bash.bashrc file, you can always restore the original Arch /etc/bash.bashrc file from the bash package and remove the /etc/DIR_COLORS file. Note that there is not an "official" bash.bashrc: each distribution has its own.

Original /etc/bash.bashrc from Gentoo

The original not modified Gentoo's /etc/bash.bashrc file can be found here.

Step by step

If you want to create a style all your own, you can take a look at these tips. This Forum thread could give you more informations and examples.

Basic prompts

The following settings are useful for distinguishing the root prompt from non-root users.

Edit Bash's personal configuration file:

$ nano ~/.bashrc

Comment out the default prompt:

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

Add the following green prompt for regular users:

[chiri@zetsubou ~]$_

PS1='\[\e[1;32m\][\u@\h \W]\$\[\e[0m\] '

Edit root's .bashrc file; copy it from /etc/skel if the file is not present:

\u - Username. The original prompt also has \h, which prints the host name.

\w - Current absolute path. Use \W for current relative path.

\$ - The prompt character (eg. '#' for root, '$' for regular users).

The last color-set sequence, "\[\e[1;37m\]", is not closed, so the remaining text (everything typed into the terminal, program output and so on) will be in that (bright white) color. It may be desirable to change this color, or to delete the last escape sequence in order to leave the actual output in unaltered color.

Advanced prompts

Load/Mem Status for 256colors

This is not even pushing the limits. Other than using 'sed' to parse the memory and load average (using the -u option for non-buffering), and the builtin history to save your history to your HISTFILE after every command, which you may find incredibly useful when dealing with crashing shells or subshells, this is essentially just making BASH print variables it already knows, making this extremely fast compared to prompts with non-builtin commands.

This prompt is from AskApache.com's BASH Power Prompt article, which goes into greater detail. It is especially helpful for those wanting to understand 256 color terminals, ncurses, termcap, and terminfo.

This is for 256 color terminals, which is where the \033[38;5;22m terminal escapes come from.

To use in a prompt (note double quotes to enable $color variable expansion and \[ \] escapes around them so they are not counted as character positions and the cursor position is not wrong):

PS1="\[$txtblu\]foo\[$txtred\] bar\[$txtrst\] baz : "

If you experience premature line wrapping when entering commands at the prompt then missing escapes is most likely to be the reason.

Prompt escapes

The various Bash prompt escapes listed in the manpage:

Bash allows these prompt strings to be customized by inserting a
number of backslash-escaped special characters that are
decoded as follows:
\a an ASCII bell character (07)
\d the date in "Weekday Month Date" format (e.g., "Tue May 26")
\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
\e an ASCII escape character (033)
\h the hostname up to the first `.'
\H the hostname
\j the number of jobs currently managed by the shell
\l the basename of the shell's terminal device name
\n newline
\r carriage return
\s the name of the shell, the basename of $0 (the portion following
the final slash)
\t the current time in 24-hour HH:MM:SS format
\T the current time in 12-hour HH:MM:SS format
\@ the current time in 12-hour am/pm format
\A the current time in 24-hour HH:MM format
\u the username of the current user
\v the version of bash (e.g., 2.00)
\V the release of bash, version + patch level (e.g., 2.00.0)
\w the current working directory, with $HOME abbreviated with a tilde
\W the basename of the current working directory, with $HOME
abbreviated with a tilde
\! the history number of this command
\# the command number of this command
\$ if the effective UID is 0, a #, otherwise a $
\nnn the character corresponding to the octal number nnn
\\ a backslash
\[ begin a sequence of non-printing characters, which could be used
to embed a terminal control sequence into the prompt
\] end a sequence of non-printing characters
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
(see HISTORY below), while the command number is the position in
the sequence of commands executed during the current shell session.
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 (see
the description of the shopt command under SHELL BUILTIN COMMANDS
below).

Positioning the cursor

The following sequence sets the cursor position:

\[\033[<row>;<column>f\]

The current cursor position can be saved using:

\[\033[s\]

To restore a position, use the following sequence:

\[\033[u\]

The following example uses these sequences to display the time in the upper right corner:

PS1=">\[\033[s\]\[\033[1;\$((COLUMNS-4))f\]\$(date +%H:%M)\[\033[u\]"

The environment variable COLUMNS contains the number of columns of the terminal. The above example substracts 4 from its value in order to justify the five character wide output of date at the right border.

Return value visualisation

Warning: Changing your prompt as described below is buggy on some terminals. You can avoid the bugs by adding a newline \n after the return value symbols.

Add this line if you want to see the return value of the last executed command.

Wolfman's

After reading through most of the Bash Prompt Howto, the author developed a color bash prompt that displays the last 25 characters of the current working directory. This prompt should work well on terminals with a black background. The following code goes in file ~/.bashrc.

Add the bash_prompt_command function. If you have a couple directories with long names or start entering a lot of subdirectories, this function will keep the command prompt from wrapping around the screen by displaying at most the last pwdmaxlen characters from the PWD. This code was taken from the Bash Prompt Howto's section on Controlling the Size and Appearance of $PWD and modified to replace the user's home directory with a tilde.

##################################################
# Fancy PWD display function
##################################################
# The home directory (HOME) is replaced with a ~
# The last pwdmaxlen characters of the PWD are displayed
# Leading partial directory names are striped off
# /home/me/stuff -> ~/stuff if USER=me
# /usr/share/big_dir_name -> ../share/big_dir_name if pwdmaxlen=20
##################################################
bash_prompt_command() {
# How many characters of the $PWD should be kept
local pwdmaxlen=25
# Indicate that there has been dir truncation
local trunc_symbol=".."
local dir=${PWD##*/}
pwdmaxlen=$(( ( pwdmaxlen < ${#dir} ) ? ${#dir} : pwdmaxlen ))
NEW_PWD=${PWD/#$HOME/\~}
local pwdoffset=$(( ${#NEW_PWD} - pwdmaxlen ))
if [ ${pwdoffset} -gt "0" ]
then
NEW_PWD=${NEW_PWD:$pwdoffset:$pwdmaxlen}
NEW_PWD=${trunc_symbol}/${NEW_PWD#*/}
fi
}

The next fragment generates the command prompt and various colors are defined. The user's color for the username, hostname, and prompt ($ or #) is set to cyan, and if the user is root (root's UID is always 0), set the color to red. The command prompt is set to a colored version of Arch's default with the NEW_PWD from the last function.

Also, make sure that your color variables are enclosed in double and not single quote marks. Using single quote marks seems to give Bash problems with line wrapping correctly.

Finally, append this code. This ensures that the NEW_PWD variable will be updated when you cd somewhere else, and it sets the PS1 variable, which contains the command prompt.

PROMPT_COMMAND=bash_prompt_command
bash_prompt
unset bash_prompt

KitchM's

These prompts offer a little more flash and visual clarity. Note that the use of red in the root user's prompt should provide ample warning. That is not to say someone could not use flashing text or arrow to do even more, but these will give you a good starting point.

First, change the default background in your terminal preferences (this example uses Xfce's Terminal program) to #D2D2D2, and the text color to #000000. The font is listed as DejaVu Sans Mono Book 12. The cursor color is #00AA00, and the tab activity color is #AF0000.

Second, in ~/.bashrc and right after the PS1= line, enter a new line with the following:

These are double-line prompts, and they should look something like these:

User-

Username on myhost Sun Jan 15 12:30 PM[dir.= /home/username] 1 >

Root-

Root on myhost Sun Jan 15 12:30 PM[dir.= /etc/rc.d] 1 >

You will note that the background colors make them easier to read, and the text colors just keep things interesting. There is a lot of leeway to make them personalized, just with the use of colors. Enjoy!

Set window title

Xterm and many other terminal emulators (including PuTTY) allow you to set the window title using special escape sequences. You can define the ${XTERM_TITLE} variable as follows, then insert it at the beginning of the prompt to set xterm title (if available) to directory@user@hostname:

The text between 0; and \a can be set to anything you like, for example:

export PS1='\[\e]0;Welcome to ArchLinux\a\]\$>> '

sets the window title to "Welcome to ArchLinux" and displays this simple prompt:

$>>_

Different colors for text entry and console output

If you do not reset the text color at the end of your prompt, both the text you enter and the console text will simply stay in that color. If you want to edit text in a special color but still use the default color for command output, you will need to reset the color after you press enter, but still before any commands get run. You can do this by installing a DEBUG trap in your ~/.bashrc, like this: