It’s History: Bash Command Line History Explained

Using Bash Command Line History

Using Bash Command Line History

Built right into your command shell is a simple record of the commands that you have recently used.  This command history can be quite useful as you try to figure out how you did something amazing or perhaps a mistake.  Reviewing the history can be really useful.  Your history can also be a security issue if somehow you have sensitive information recorded in your history and your account is compromised.  Overall, I am confident that you will find “history” to be an excellent tool!

Show Your Full Command History



Just typing the command “history” will print to the screen all of your recorded history.

$ history
 1 pwd
 2 ls
 3 ping 10.2.1.42
...
15 history
16 cat /etc/hosts
17 df -h
18 man ls
19 pwd
20 mkdir mydir1
21 cd mydir1
22 touch file1
23 history
$

You can also specify how many lines of history you would like to have output by specifying the commands you wish to see after the history command

$ history 5
22 touch file1
23 df -h
24 cd mydir1
25 pwd
26 history 5

 

Running Commands From Bash History

Of course, you could always copy and paste the commands from your history display to run them again.  But you can also do it the way it was designed to be run.  You can rerun the last command using !!

Example:  Run the last bash command from your bash history using !!.  In this case, the last command is “pwd”.

$ !!
 pwd
 /root/mydir1

Rerunning command from bash history can be done by using an exclamation mark (!) and specifying the command number that you wish to rerun.

$ !25
pwd
/root/mydir1



You can also add additional text to your command.

Example:  Find a command from bash history –in this case, command 22– and run it again but with additional text.

history
...
 22 touch file1
...
$ !22 file2
 touch file1 file2

ReRun the Last Instance of a Command Containing a Specific String from Bash History

Let’s imagine that you know that the command you want to rerun from your history contains some text that you want to search on.  You can run it instantly by typing !<string>.  You need to be really sure that you know what you are doing when you do this or you could run the wrong command.  Remember that this will run the last instance of whatever command contains that particular text string.

Example:  Rerun the last entry in bash command history containing the string “touch”

$ !touch
 touch file1 file2

Editing Command Line History

Let’s imagine that we want to slightly alter a command that we recently ran.  We can alter the bash command history.

Example:  I run an ls command with specific options.  Then I run the command again from command history but alter the command using s/alth/l.

$ ls -alth
total 8.0K
dr-xr-x--- 9 jeff jeff 4.0K Jun 15 03:12 ..
drwxr-xr-x 2 jeff jeff 4.0K Jun 15 01:51 .
-rw-r--r-- 1 jeff jeff 0 Jun 15 01:51 target.txt
-rw-r--r-- 1 jeff jeff 0 May 29 02:53 file1
-rw-r--r-- 1 jeff jeff 0 May 29 02:53 file2
-rw-r--r-- 1 jeff jeff 0 May 29 02:53 file3
$ !ls:s/alth/l
ls -l
total 0
-rw-r--r-- 1 jeff jeff 0 May 29 02:53 file1
-rw-r--r-- 1 jeff jeff 0 May 29 02:53 file2
-rw-r--r-- 1 jeff jeff 0 May 29 02:53 file3
-rw-r--r-- 1 jeff jeff 0 Jun 15 01:51 target.txt


Edit Commands from Bash History with an Editor

Edit a Command from bash history using the vi editor with FC command.

By changing your FCEDIT variable, you can change your FC editor to vi, vim, emacs or gedit for example.

Example:  I edit command 1010 and add a www. to the front of the domain name.

 1010 dig uptimemadeeasy.com
...
$ fc 1010
dig www.uptimemadeeasy.com

 

Example:  We specify the editor that we want to use with the -e option to edit command #35 from our bash history, then we run the command.

$ history
...
35 touch file1 file2
...
$ fc -e vi 35
touch file1 file2 file3

 

Search Through Bash Command History

While you can easily run history and pipe it to grep on something you are searching on, there are other options specifically built for searching the bash command line history.  The first option is to use the up and down arrows to scroll through the past commands one by one.

Another option is to use <ctrl+r> directly from your bash shell.  After typing <ctrl+r>, type in the string that you are searching for.  It will show you the most recent command instance containing that string.  If it doesn’t show you the command that you are looking for, type <ctrl+r> again and again and it roll through all of the instances of the string.  Once you find the command that you want to run, hit the enter key and it will run the command for you.

Bash Command Line History Variables

HISTFILE – Shows the path and filename of your history file.

$ echo $HISTFILE
/home/jeff/.bash_history

HISTFILESIZE – Shows the max number of commands stored in your bash_history.  After it reaches this number, older commands will be discarded.  If you want more or fewer commands stored, change the variable to a different number.

$ echo $HISTFILESIZE
1000

HISTCMD – The history number of your current command.

echo $HISTCMD
1007

Remove Command from Bash History

Removing commands from the bash command history is as simple as using the -d option to the “history” command. Just list the command number and it will be removed.

Example:  delete commands 876, 459, 321, 65 from the bash command history.

$ history -d 876 459 321 65

Example:  clear bash command history completely from all past commands.

$ history -c

Of course, you could always just remove your .bash_history file which would do the same thing.

$ rm -f $HOME/.bash_history

Other History Options

history -w write the command history from memory into $HOME/.bash_history
history -a append the lines entered since starting the current bash session to the history file (.bash_history).

Other Resources

There are other loctions where you can get more information on bash command line history:

https://www.digitalocean.com/community/tutorials/how-to-use-bash-history-commands-and-expansions-on-a-linux-vps

https://access.redhat.com/site/documentation/en-US/Red_Hat_Enterprise_Linux/3/html/Step_by_Step_Guide/s1-managing-command-history.html

 

 

The following two tabs change content below.
Jeff has 20 years of professional IT experience, having done nearly everything in his roles of IT consultant, Systems Integrator, Systems Engineer, CNOC Engineer, Systems Administrator, Network Systems Administrator, and IT Director. If there is one thing he knows for sure, it is that there is always a simple answer to every IT problem and that downtime begins with complexity. Seasoned IT professional by day, Jeff hopes to help other IT professionals by blogging about his experiences at night on his blog: http://uptimemadeeasy.com. You can find Jeff on or LinkedIn at: LinkedIn or Twitter at: Twitter

Latest posts by Jeff Staten (see all)

Leave a Reply

Your email address will not be published. Required fields are marked *