Developers, sysadmins, and DevOps engineers spend a lot of time at the Linux command line. And, invariably, we make
tpyos typos. Other times, we just need to run the same command again or determine what commands were previously executed on a system. In all of those cases, knowing how to work with Linux bash history command helps.
In this article, we'll take a closer look at what bash history is, how it works, and how you can use it to become more efficient when you're working at the Linux command line. You can follow along with the commands in this article using almost any modern *nix operating system with bash.
What is Bash history?
The term bash history refers to the commands, files, and shortcuts that allow you to view, modify, and delete bash commands that have been run on a system.
Bash has two bulitin commands for working with bash history:
history- Allows you to list commands and modify your bash history.
fc- Allows you to list, edit, and execute commands from your bash history.
Because the term "bash history" often implies the
history command, we'll focus on the mechanics of the
history command instead of
fc for most of this article.
In addition to these two bulitin commands, there are a variety of files (like
~/.bash_history), expansions (like
!!), and keyboard shortcuts (like the ↑ and ↓ keys) that help you work with bash history.
In the sections below, we'll explore how these aspects of bash history work.
Where is Bash history stored?
history stores commands in RAM until you log out of the terminal. Once you log out, commands are written to disk in the
~/.bash_history file. The history buffer is limited to 1,000 command entries and the history file is limited to 2,000 entries.
You can modify the default behavior of the
history command by setting environment variables, which we'll review in more detail shortly.
Working with Bash history: the basics
Bash history is a feature that allows you to view and clear previously executed commands. Below, we’ll go through how to see bash history, how to clear bash history, as well as how to search through the bash history.
How to see Bash history?
The easiest way to get started working with bash is to run the
history command with no options. You should see output similar to this:
history 1 echo "one" 2 echo "two" 3 echo "three" 4 echo "four" 5 echo "five" 6 echo "six"
The numbers next to the commands indicate the order they were entered into the history (the oldest command being 1). You can also use the ↑ and ↓ keys on your keyboard to scroll through your bash history.
We can limit the output to the last N commands with the command
history N. For example,
history 2 will return the 2 most recent commands.
history 2 6 echo "six" 7 history 2
You can pipe history into
less to make it easier to filter the output.
history | grep ping 6 ping cherryservers.com 27 history | grep ping
How to clear Bash history?
To clear Bash history, you can delete a specific entry with the
history -d N where N is the number of the command or a range of numbers. For example,
history -d 2-4 deletes commands 2, 3, and 4 from our history.
To clear the history buffer (i.e., the commands saved in RAM for the current terminal session) use the command
The bash history saved to disk is in the
$HISTFILE which is
~/.bash_historyby default. You can clear that file with a command such as:
cat /dev/null > ~/.bash_history
Configuring Bash history settings with .bashrc
In some cases, you may want to modify how bash history works on your Linux system. Adding Linux environment variables to your
~/.bashrc file can help you do just that. Here are some common use cases for customizing bash history using
As we go, remember that changes to a user's
~/.bashrc file take into effect after logging out and logging back into your shell. Alternatively, you may run
. ~/.bashrc or
source ~/.bashrc to reload bash settings.
Exclude commands from Bash history
You may want to exclude commands from bash history to avoid noise in the output or for security reasons. On many Linux distros, you can prevent a command from being included in bash history by adding a space before you execute the command.
However, that may not hold true on all distros. Whether or not leading spaces are ignored depends on the
$HISTCONTROL environment variable. If
$HISTCONTROL is set to
ignorespace, commands with a leading space are not saved to history.
To exclude commands from your bash history with
~/.bashrc, you can use the
$HISTIGNORE environment variable.
$HISTIGNORE allows you to define a colon separated list of command patterns that will not be saved to your bash history. For example, to ignore any
sudo commands or any commands where
echo is followed by a
w, add this to your
HISTIGNORE='sudo *':'echo w*'
Immediately persist commands to .bash_history
It's common for users to have multiple terminals open for the same user account, and this is where things can get tricky. By default, the
history command will only show commands from the current terminal session and the commands that are saved to the
~/.bash_history file are the commands from the last session to log out.
To immediately persist commands to your
~/.bash_history file, you can add this to
Bash history with timestamp: add date and timestamps to Bash history output
Often, knowing when you ran a command is an important part of knowing which command you need now. Adding timestamps to your bash history output can help make this easier.
To include timestamps with your bash history, add this to your
HISTTIMEFORMAT="%F %T "
%F adds the date in YYYY-MM-DD format and
%T adds a HH:MM:SS timestamp. Here is an example of what
history command output looks like with this bash environment variable set.
Note that the space after the
%T is useful for formatting the output. Without the spacing, the date, timestamp, and command would all run together.
Modify Bash history buffer and file size
If the default values of 1,000 command entries in the history buffer and 2,000 entries in the history file isn't what you want, you can change the
$HISTSIZE (buffer) and
$HISTFILESIZE (file) environment variables.
For example, to set both to 11,000 entries, modify the default values to read:
Search Bash history: keyboard shortcuts
In addition to the
history command, there are several keyboard shortcuts that make working with bash history easy. Here are some of the most useful:
|Bash history keyboard shortcut||Description|
|↑ key||Scroll backwards through bash history|
|↓ key||Scroll forward through bash history|
|ctrl+R||Search for commands in your bash history|
|ctrl+O||Run a command you found using a ctrl+R search|
|ctrl+G||Exit a crtl+R search|
Bash history expansion
If you've ever run
sudo !!, you've already used a bash history expansion command. However, there are plenty of other ways to use expansion commands to work with your bash history. Here is a list of some of the most useful bash history expansions:
|Bash history expansion command||Description|
||The last command executed in the terminal. This is equivalent to
||The Nth command in your bash command history.|
||The command N before the most recent command in your bash history.|
Here's a simple example to demonstrate the logic:
Note that in the example we added a space before our expansion commands so they aren't included in our bash history.
Bash history designators
All three of the previous expansion commands are examples of designators. And there are several more powerful designators you can use to work with your bash history.
!<command> will execute the most recent
<command> in your bash history. For example, suppose we have these commands in our
1 ping 220.127.116.11 2 touch pepperandegg.txt 3 curl -Lo cherry.html cherryservers.com 4 rm somefile.log 5 ls -la
!curl will run
curl -Lo cherry.html cherryservers.com,
!ls will run
ls -la, etc.
You can also use
^designators to substitute parts of the most recent command in your bash history with different content. The general format is:
^<original content>^<new content>^
For example, if the previous command in your history was:
scp this.file root@host:/path/wrongplace
And you wanted to change
/path/rightplace instead of typing the entire command again, you could run:
And the output would be similar to:
scp this.file root@localhost:/tmp/rightplace root@host's password: this.file 100% 10 0.0KB/s 00:01
Use designators to get arguments from a command
You can use a colon
: followed by a specific designator to add arguments from the most recent command in your history to a subsequent command. The table below details some of the common designators:
||Use the 1st argument of the most recent command in your bash history.|
||Use the Nth argument of the most recent command in your bash history|
||Use the last argument of the most recent command in your bash history.|
||Use all the arguments of the most recent command in your bash history.|
Below is an example to visualize the concept:
Bash history modifiers
Bash history modifiers complement designators by changing the content or execution of the command. You specify modifiers after a command with a colon and a letter (e.g.,
Here are some common bash history modifiers and what they do.
||Removes the trailing path from a command. Useful for getting a path without a filename.|
||Removes the leading path from a command. Useful for getting a filename without a path|
||Removes an extension from a filename.|
||Prints a command without running it.|
||Enables string substitution comparable to the
For example, suppose we wanted to list all the
.log files in a directory with
ls /directory/*.log but instead we ran the command
ls /directory/*.txt. We could use the command
!:s/txt/log to correct the mistake. End-to-end, it would look similar to this:
ls /directory/*.txt pepperAndEgg.txt !:s/txt/log ls /directory/*.log log1.log log2.log log3.log
With knowledge of bash history commands, you can work more efficiently at a Linux terminal. The information we covered here should help you handle most of the common bash history use cases you'll encounter. For a deeper dive on bash history, we recommend reading the GNU man page for the bulitin bash history commands and testing different designators and customizations in your own test environment.