.bash_history に重複したコマンドを記録させないようにするというのは嘘で2回同じコマンドを入力した場合にのみ2回目のコマンドをヒストリに登録しないようにする。注意したい点は、重複するコマンドをヒストリに登録しない、のではなく、続いて2回同じコマンドが入力された場合は2回目のコマンドをヒストリに登録しない、ということだ。つまり下のようにコマンドを打つと、全てがコマンドヒストリに登録される。
$ ls $ cd hoge $ ls
これに対して次のようにした場合ははじめのコマンドのみがコマンドヒストリに登録される。
$ ls $ ls $ ls
つまり、比較対象は1つ前のコマンドのみということだ。下のようにすれば、入力したコマンドと一つ前のコマンドとを比較して、同じなら記録せず、異なっていれば記録する。ということになる。
$ echo export HISTCONTROL=ignoredups >> ~/.bashrc
比較は一つ前のコマンドについてのみなされるということは、すでに登録されたものに対してはされないということだ。
たとえば ~/.bash_history にある重複行を削除したいときは下のようにすればいい。
$ perl -lne 'push @a,$_; END{ @s=grep(!$t{$_}++,@a); print map{"$_\n"}@s}' ~/.bash_history
こうすれば、 ~/.bash_history に登録されている順番を崩さずに重複行のみを削除できる。下のようにしてもよいが、
$ sort ~/.bash_history | uniq
この場合は順番が崩れる。~./bash_history の重複行を削除するということに意味があるかは判らない。なぜなら、入力したコマンドはその順番も含めて意味のあるものだと思うから。