Knowing your history

Shells provide an interesting feature that allows you to find out the history of all commands you have executed previously in a shell. It often happens that we forget what command was typed on the previous day to perform a task. We may or may not be able to recall the exact syntax, but it is very convenient that we can refer to the history saved by the shell.

Shell variables controlling the history

There are shell variables that can be altered to change what and how much history a user can see. These shell variables are mentioned in the following table:

Name

Value

HISTFILE

Name of file in which by default history will be saved

HISTFILESIZE

Number of commands to be kept in history file

HISTSIZE

Number of history to be stored in memory for current session

HISTCONTROL

A colon-separated list of values controlling how commands are saved on the history list

The value of the HISTCONTROL shell variable can be:

Value

Description

ignorespace

Lines which starts with a blank space, doesn't save in history list

ignoredups

Don't save lines which matches in previous saved history list

ignoreboth

Applies both ignorespace and ignoredups

erasedups

Remove all previous lines from history matching current line before saving it in history file

Let's see what values these shell variables may contain:

$  echo $HISTFILE
/home/foo/.bash_history
$ echo $HISTFILESIZE
1000
$ echo $HISTSIZE
1000
$ echo $HISTCONTROL
ignoredups

From the value obtained, we can see that the default history is saved into the .bash_history file of a user's home directory, with the maximum history command lines saved as 1000. Also, any duplicate history that is already present in the previous history line isn't saved.

The history builtin command

Shells provide the history builtin command so that a user will know the history of commands executed up to now.

Running the history without any options, prints all the previously typed commands on stdout. The sequence of commands are provided oldest to latest as we go from top to bottom of the output:

$ history  # Prints all commands typed previously on stdout
$ history | tail -n10    # Prints last 10 commands executed
The history builtin command

The following table explains the options available with the history shell built - in command:

Option

Description

-a

Append the new history lines into history immediately

-c

Clears history from current list

-d offset

Deletes history from offset specified

-r

Append the content of saved history to current list

-w

Write the current history list to the history file after overwriting existing saved history contents

To see the last five commands executed, we can also perform the following commands:

$ history 5
  769  cd /tmp/
  770  vi hello
  771  cd ~
  772  vi .bashrc 
  773  history 5

We will find that all the commands executed match a given string from the history file. For example, search for commands having the set string in them:

$ history | grep set 
  555  man setenv
  600  set | grep ENV_VAR2
  601  unset ENV_VAR2
  602  set | grep ENV_VAR2
  603  unset -u  ENV_VAR2  
  604  set -u  ENV_VAR2
  605  set | grep ENV_VAR2
  737  set |grep HIST
  778  history | grep set

To clear all the history of commands saved and to append the history available in the current list, we can do the following (don't run the following commands if you don't want to loose the saved command history):

$ history -c  # Clears history from current list
$ history -w  # Overwrite history file and writes current list which is empty

Modifying the default history behavior

By default, shell has some values set for managing the history. In the previous section, we saw that a maximum of 1000 lines of history will be stored in the history file. If a user spends most of his time working with a shell, he may have used 1000 or above commands in one or two days. In such a case, he will not be able to look at the history if he has typed a command ten days ago. Depending upon the individual use-case, a user can modify the number of lines to be stored in the history file.

Executing the following command will set the maximum number of lines the history file may have to 100000:

$ HISTFILESIZE=100000

Similarly, we can change where the history file should be saved. We saw that, by default, it is saved in the .bash_history file in the home directory. We can modify the HISTFILE shell variable and set it to whatever location we want our command history to be saved to:

$  HISTFILE=~/customized_history_path

Now the executed command history will be saved in the customized_history_path file in the home directory instead of the ~/.bash_history file.

To make these changes reflect to all the shells being launched by a user and for all sessions, add these modifications to the ~/.bashrc file.

Handy shortcuts for seeing the history

Depending upon a user's history size setting, the number of commands available in the history may be large. If a user wants to look for a specific command, he or she will have to look through the entire history, which can sometimes be troublesome. Shells provide some shortcuts to help us find a specific command previously executed. Knowledge of these shortcuts can save time in finding previously executed commands in the history.

[Ctrl + r]

While working in a shell, the [Ctrl + r] shortcut allows you to search for a command in the history. Start typing a command after pressing [Ctrl + r]; the shell shows a complete command that matches the substring of the command typed. To move forward to the next match, type [Ctrl + r] on the keyboard again and so on:

$ [ctrl + r]
(reverse-i-search)'his': man history

We can see that typing his, suggested from history man history that we previously typed.

Up and down arrow key

The up and down arrow keys available on the keyboard can be used to go back and forward in the history of commands previously executed by the user. For example, to get the previous command, press the up arrow key once. To go back even further, press the up arrow key again and so on. Further, to go forward in the history use the down arrow key.

!!

The shortcut !! can be used to reexecute the last command executed in the shell:

$ ls /home/
lost+found  foo
$ !!
ls /home/
lost+found  foo

!(search_string)

This shortcut executes the last command starting with search_string:

$ !l
ls /home/
lost+found  skumari
$ !his
history 12

!?(search_string)

This shortcut executes the last command found with the substring search_string:

$ !?h
ls /home/
lost+found  skumari
..................Content has been hidden....................

You can't read the all page of ebook, please click here login for view all page.
Reset
3.145.166.241