Book HomeLinux in a NutshellSearch this book

7.6. Command History

bash lets you display or modify previous commands. This is similar to the C shell's history mechanism. Commands in the history list can be modified using:

  • Line-edit mode

  • The fc command

In addition, the command substitutions described in Chapter 8, "csh and tcsh", also work in bash.

7.6.1. Line-Edit Mode

Line-edit mode lets you emulate many features of the vi or Emacs editors. The history list is treated like a file. When the editor is invoked, you type editing keystrokes to move to the command line you want to execute. Arrow keys work on most terminals in both Emacs mode and vi command mode. You also can change the line before executing it. See Table 7-23 for some examples of common line-edit commands. When you're ready to issue the command, press Return.

The default line-edit mode is Emacs. To enable vi mode, enter:

$ set -o vi

Note that vi starts in input mode; to type a vi command, press Esc first.

The mode you use for editing bash commands is an entirely separate choice from the editor that is invoked for you automatically within many commands (for instance, the editor mail readers invoke when you ask them to create a new mail message). To change the default editor, set the VISUAL or EDITOR variable to the filename or full pathname of your favorite editor:

$ export EDITOR=emacs

Table 7-23. Common Editing Keystrokes

vi Emacs Result
k Ctrl-P Get previous command.
j Ctrl-N Get next command.
/string Ctrl-R string Get previous command containing string.
h Ctrl-B Move back one character.
l Ctrl-F Move forward one character.
b Esc B Move back one word.
w Esc F Move forward one word.
X Del Delete previous character.
x Ctrl-D Delete one character.
dw Esc D Delete word forward.
db Esc H Delete word back.
xp Ctrl-T Transpose two characters.

7.6.4. Variables in Prompt

Using the following variables, you can display information about the current state of the shell or the system in your bash prompt. Set the PS1 variable to a string including the desired variables. For instance, the following command sets PS1 to a string that includes the \w variable in order to display the current working directory and the \! variable in order to display the number of the current command. The next line is the prompt displayed by the change.

$ PS1='\w: Command \!$ '
~/book/linux: Command 504$

Some of the prompt variables are relatively new, such as \j and \l, so they may not be supported in your version of bash.

Variable Meaning


Alarm (bell)


Date in the format "Mon May 8"


Escape character (terminal escape, not backslash)




Number of background jobs (active or stopped)


Current terminal name


Newline inserted in the prompt


Carriage return inserted in the prompt


Current shell


Time in 24-hour format, where 3:30 p.m. appears as 15:30:00


User's account name


Version and release of bash


Current working directory


Like \h


Time in 12-hour format, where 3:30 p.m. appears as 03:30:00


Version, release, and patch level of bash


Last element (following last slash) of current working directory


Single backslash inserted in the prompt


Number of current command in the command history


Number of current command, where numbers started at 1 when the shell started


Time in 12-hour format, where 3:30 P.M. appears as 03:30 p.m.


Indicates whether you are root: displays # for root, $ for other users


Starts a sequence of nonprinting characters, to be ended by \]


Ends the sequence of nonprinting characters started by \[


The character in the ASCII set corresponding to the octal number nnn inserted into the prompt

Library Navigation Links

Copyright © 2001 O'Reilly & Associates. All rights reserved.