bash can run a UNIX command, or multiple commands, before it prints every prompt. This command does not have to set the prompt; it just happens to be run before each prompt is printed. The command could do some system checking, reset shell variables, or almost anything that you could type at a shell prompt. Store the command(s) in the PROMPT_COMMAND shell variable. If the commands run slowly, though, they'll delay your prompt.
Here's a silly example that I used to have in my bash setup file (2.2):
IFS set smiley shift $# | PROMPT_COMMAND=' # Save old $IFS; set IFS to tab: OIFS="$IFS"; IFS=" " # Put x in $1, face in $2, explanation[s] in $3[, $4, ...]: set x `smiley` # Put face into $face and explanation(s) into $explan: face="$2"; shift 2; explan="$*" # Restore shell environment: shift $#; IFS="$OIFS"' # Prompt I use (includes the latest $face): PS1='\u@\h $face ' |
---|
The first part is a series of shell commands that are
stored in the PROMPT_COMMAND variable;
they're surrounded by a pair of single quotes (' '
), one on
the first line (after the =
) and the other after IFS
is
reset.
That series of commands is executed before every prompt.
It sets two shell variables, $face
and $explan
, with
new values before each prompt is set.
The prompt is set on the last line; it includes the value of $face
.
Here's what my screen looked like with this ridiculous setup.
Notice that the prompt keeps changing as the PROMPT_COMMAND
resets $face
and $explan
.
If I wanted the explanation of a face I saw as I went along, I could type
echo <">$explan<">
:
jerry@ruby :-{)echo "$explan"
normal smiling face with a moustache jerry@ruby +<||-)vi proj.cc
... jerry@ruby :-Oecho "$explan"
Mr. Bill Wow! ohh, big mouth, Mick Jagger uh oh jerry@ruby :-) <g++ -Wall proj.cc
...
(It was even more useless than psychoanalyze-pinhead (32.13), but it was fun while it lasted.) Seriously now, I'll say again: PROMPT_COMMAND does not have to be used to set a prompt. You can use it to run any commands. If the commands in PROMPT_COMMAND write to standard output or standard error, you'll see that text before the prompt.
-