I've been on Linux for more than 6 months now but never went too much into the CLI (command-line interface or terminal or shell)

Now as I ask questions here, get answers, or help from other sites, I learn new commands...

How can I can store every new command in a text file? Only new/unique commands, not repetitions of the same command.

Here's an example:

  1. In the terminal, I enter the commands like this-
$  command1
$  command2
$  command3
$  command4
$  command1
  1. Now, these commands should get saved in a text file say commandrec like this

NOTE: The last command in the terminal which was again command1 is not recorded/saved again in the text file.

And the next time I open the terminal, and enter a new command command 5, it should get appended to the list in commandrec

(but if the command was used earlier on some other date, it should still be ignored. For example, command 1 entered again along with command 5 on a new day/time but command1 not recorded as already used)

  1. The commandrec file will be looking something like this
31/05/12 12:00:00
01/06/12 13:00:00
command 5

(the time and date thing would be great if possible, but okay even if that isn't there)

This way, I can have a record of all commands used by me to date.

How can this be done?

  • what do you want to do with the list that gets generated? if you just want to view it, you could do the sort thing @Chris suggested whenever you need to read the file and output it to a permanent file – Dirk Hartzer Waldeck Jun 1 '12 at 9:19
  • @DirkHartzerWaldeck...yes i want to view it as and when needed..the chris thing will definitely help..its gr8...if nothing else comes up,thats the best way...but would like to have it like what i have mentioned in the question(time,date,etc) and plus..if i copy this file from .bash_history to another one and then sort it,i'll have to manually copy it everytime!(i want to copy it and not edit the .bash_history because i want to add comments to it) – Nirmik Jun 1 '12 at 9:22
  • you could create a bash script file that automates this, so instead of opening a text file, you'll run a script that adds and sorts a text file and then opens it. this way you could also add extra info as needed. – Dirk Hartzer Waldeck Jun 1 '12 at 9:53
  • @DirkHartzerWaldeck...well i do not know bash scripting! if you could help.. – Nirmik Jun 1 '12 at 9:55
  • @virpara...as per the above comments...a bash script needed! i know you can! ;) – Nirmik Jun 1 '12 at 9:56

How to successfully experiment with changing these settings in .bashrc

  • Before experimenting: Save your current .bash_history to another file with cp.
  • While experimenting with what works: rm ~/.bash_history after you change .bashrc with history control parameters, otherwise the combo of old and new entries may give you weird results.
    • e.g., all entries before timestamps were enabled will show the same current date/time!
  • Once you find something that works, DO NOT rm any more!!

  • Note also that any changes to .bashrc are reflected only when you exit and then instantiate a new terminal/shell.

Increasing history size and eliminating duplicates

  • Add these lines to your ~/.bashrc:

    export HISTCONTROL=erasedups
    export HISTSIZE=10000
  • History size is set to 10000, duplicates are automatically eliminated so it's plenty of space :)


  • Time can be set easily by adding another line of the form export HISTTIMEFORMAT="%F %T", this will display the time/date before each line when using history
    • Example:
      izx@preciseunity:~$ history
      1  2012-06-01 07:16:22 rm ~/.bash_history
      2  2012-06-01 07:16:23 exit
      3  2012-06-01 07:16:27 ls
      4  2012-06-01 07:16:31 test
      5  2012-06-01 07:16:34 ls /etc
      6  2012-06-01 07:16:36 down
      7  2012-06-01 07:16:37 up
      8  2012-06-01 07:16:40 hustory
      9  2012-06-01 07:16:48 history
    • Note that because duplicates are eliminated, the time shown for a command is the latest (newest) time it was last executed.
    • You can customize the HISTTIMEFORMAT to your choice/locale based on strftime
  • could u give me a more stepwise approach?i dint get rm with this n stuff.. :( – Nirmik Jun 1 '12 at 14:35
  • See edits; all it says is, when you are playing with settings, safer to delete .bash_history each time you change something (since the old entries won't change, and will have weird effects; e.g. adding time will show today's date/time for all old entries before the change). Once you have setting you like, no need to do this :) – ish Jun 1 '12 at 14:42
  • 1
    It's worth pointing out that when you say eliminate "duplicates" here, this means eliminating the same command lines in the history. But if you used the same command with different files or parameters, they will not count as duplicates. – Chan-Ho Suh Jun 1 '12 at 16:51
  • @Chan-HoSuh: Yes, good point. black-magic-voodoo /etc is not the same as black-magic-voodoo ~/. Eliminating those kinds of duplicates would probably require a perl script or multiple passes through the usual text processing commands. – ish Jun 1 '12 at 22:24
  • 1
    The only issue I see with this is multiple terminals clobbering each other's history – RobotHumans Jun 3 '12 at 8:10

Your aim is to learn new commands? I recommand to use CLI Companion:

CLI Companion is a tool to store and run Terminal commands from a GUI. People unfamiliar with the Terminal will find CLI Companion a useful way to become acquainted with the Terminal and unlock its potential. Experienced users can use CLI Companion to store their extensive list of commands in a searchable list.

enter image description here

You get it by running:

sudo add-apt-repository ppa:clicompanion-devs/clicompanion-nightlies
sudo apt-get update
sudo apt-get install clicompanion

If you don't want to add the PPA try this file for 12.04 (latest version 1.1-6, released on 2012-04-14 - check this page for newer versions.) - or remove the PPA after installing with sudo add-apt-repository -r ppa:clicompanion-devs/clicompanion-nightlies .

PS: I found this question which could be helpful, too.

  • 2
    Despite not directly addressing the verbage of the question, I think it addresses the goal of the question. – RobotHumans Jun 1 '12 at 8:58
  • Well thanx for that..it definitely is useful :) bit not exactly what i want..it will help though :) – Nirmik Jun 1 '12 at 9:17

Going on Dirk's suggestion of going through .bash_history and chris's suggestion of using the sort command, what you probably want to do is:

cat ~/.bash_history | sed 's/sudo //g' | sort -u +0 -0 | cut -d\  -f1 > commandrec.txt

Second command in the pipeline will delete occurrences of 'sudo ' so when you sort you will sort the commands that you may type only after invoking sudo.

Bash history doesn't keep track of the time/date the command was used, but just off the top of my head, you could write a script that will be invoked when you exit the terminal. The script would call the above command (but save to commandrec-$DATE.txt where you have something like DATE = `date "+%Y-%m-%dT%H:%M:%S"`). Then you could diff with .bash-history and keep only the new commands in commandrec-$DATE.txt. So you would have a collection of such dated commandrec files. Actually, since .bash_history is limited (I think default on my system was 500), you should probably diff with the file you get by cat-ing all your commandrec*.txt files and .bash_history.

Then anytime you actually want to look at all your commands to date, you can cat all your files to a file.


Timestamping is easy. To do it, just add the following line to ~/.profile or similar:


To uniqely record every new command is tricky. First you need to add to ~/.profile or similar:

PROMPT_COMMAND='history -w'

Then you need to add to ~/.bash_logout:

history -a
history -w

in your home directory check the .bash_history file, it saves every command you enter

  • or just type history to get a list, | grep something to find something. – ish Jun 1 '12 at 7:20
  • Well that is usefull...but that is history..commands are stored multiple times as and when entered..i want to have them just once..plus I want it to be a different file so that I can add comments to it..editing .bash_history would cause troubles i guess – Nirmik Jun 1 '12 at 7:21
  • also if time and date could be added to such an entry.. – Nirmik Jun 1 '12 at 7:22
  • @izx..Check the edited question for what i exactly mean.. – Nirmik Jun 1 '12 at 7:32
  • This is not exactly what you are looking for, but maybe a little closer. You could try sort's unique option e.g. sort -u ~/.bash_history. This will sort the .bash_history file but eliminate duplicates. – Chris Jun 1 '12 at 7:50

How about a simple:

  1. Grab the information from .bash_history (All commands used in the terminal)
  2. Sort them out Alphabetically
  3. Show only Uniques
  4. Send them to a file

cat .bash_history|sort|uniq > commands.txt

If you only want the command (Without taking parameters into consideration) a simple cut will do:

cat .bash_history|cut -d ' ' -f1|sort|uniq > commands.txt

If you want to know how many times a command was executed you could:

cat .bash_history|cut -d ' ' -f1|sort|uniq -c > commands.txt

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.