Mac OSX: Change Bash Terminal Command Prompt

Bash is the default shell on Mac OS X. It is a command processor typically run in a text window, allowing the user to type commands which cause actions. It can also read commands from a script file.

Bash Configuration Files

When Bash starts, it executes the commands in a variety of different scripts.

When started as an interactive login shell:

  • Bash reads and executes the /etc/profile (if it exists).
  • After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile in that order, and reads and executes the first one (that exists and is readable).

When a login shell exits:

  • Bash reads and executes ~/.bash_logout (if it exists).

When started as an interactive shell (but not a login shell):

  • Bash reads and executes ~/.bashrc (if it exists). This may be inhibited by using the --norc option. The --rcfile file option will force Bash to read and execute commands from file instead of ~/.bashrc.

Setting Up Your Own Bash Configuration File

Create a .bash_profilein our Users home directory.

  • Open Terminal.app (be sure that you are in your Users home directory)
  • Enter the following to create a bash profile: touch .bash_profile

On the next start of Terminal.app it should use our empty .bashrc file.

Commands for Changing the Command Prompt

The command prompt is controlled via special shell variables: PS1, PS2, PS3 and PS4. If set, the value is executed as a command prior to issuing each primary prompt.

  • PS1 – The value of this parameter is expanded and used as the primary prompt string. The default value is \s-\v\$ .
  • 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 +

So 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. To change the prompt, simply add a command, as shown in the following example, to the ~/.bash_profile file and it will be invoked when you next restart Terminal.app:

    PS1="\t:\u:\w>$ "
And this will display a prompt consisting of:
<current time>:<username of the current user>:<current directory>>$

which displays, for example, as follows:

    15:33:23:francisburns:~/SoftwareDevelopment/fitnesse>$

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

More Information

For more information, see these references:

Speak Your Mind

*