Jan 061999
Changing your bash prompt
see also ShellsI’ve decided to change the prompt in my bash shell. That’s the few bits of text that your shell spits at you when it wants something from you. At present, my prompt is:
bash-2.02$
Not very exciting. So I decided to change it.
man bash
genesis– on #freebsd undernet told me where to look. I eventually found what he was looking for, but I attribute that to my impatience. Here’s the extract from the INVOCATION section which is relevant:When bash is invoked as an interactive login shell, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable.
So I will create a .bash_profile in my home directory.
.bash_profile
First, go to your home directory:cd
To create this new file, all I did was:
cp .profile .bash_profile
Then I added the following to the bottom of .bash_profile:
# set prompt: ``username@hostname:/directory $ '' PS1="[\u@\h:\w] " case `id -u` in 0) PS1="${PS1}# ";; *) PS1="${PS1}$ ";; esac
This will give you a prompt something like this:
[fleur@flossy:/usr/home/fleur]
su
When I use the su command, I supply the -l option in order to get my prompt as indicated above. This will simulate a full login. See man su for details.Prompt options
There are several options for the bash prompt. The following is an extract from the man pages. In the example above, I use \u, \h, and \w.PROMPTING When executing interactively, bash displays the primary prompt PS1 when it is ready to read a command, and the secondary prompt PS2 when it needs more input to complete a command. Bash allows these prompt strings to be cus- tomized 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") \e an ASCII escape character (033) \h the hostname up to the first `.' \H the hostname \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 \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 the current working direc- tory \! 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 con- trol sequence into the prompt \] end a sequence of non-printing characters The command number and the history number are usually dif- ferent: 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 exe- cuted during the current shell session. After the string is decoded, it is expanded via parameter expansion, com- mand substitution, arithmetic expansion, string 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).
Exactly what I was looking for. They don’t make this info easy to find!
there is no need for the case statement in that script. all five lines can be duplicated with one line:
PS1="[\u@\h:\w]\$ "
the \$ will put a # for uid = 0 and a $ for all others automatically. this is mentioned in the article but the author does not use this method.