いつ実行したか覚えてる?historyコマンドの出力に日時を追加する方法 | Linux Fan

いつ実行したか覚えてる?historyコマンドの出力に日時を追加する方法

2017年8月23日

historyコマンド、使っていますか?コマンドのヒストリはCtrl-rで検索できるので、直接historyコマンドを使うことは少ないって人も多いかもしれませんね。とはいえ、「しばらく前に実行したあのコマンド、どんなパラメーターを書いてたっけ」というような時、「history | less」とか「history | grep なんちゃら」とか実行することもあるんじゃないでしょうか。

このhistoryコマンド、デフォルトだと以下のような感じで出力されますよね。

$ history
    1  passwd
    2  history

これでも十分役に立つんですが、実行した日時も分かるともっと助かりますよね。そこで、以下のコマンドを実行します。

export HISTTIMEFORMAT='%F %T '

すると、これ以降はコマンドを実行した日時も保存されるようになります。いくつかコマンドを実行してからhistoryコマンドを実行してみてください。以下のような出力になるはずです。

$ history
    1  2017-08-23 16:31:40 passwd
    2  2017-08-23 16:31:40 history
    3  2017-08-23 16:32:07 export HISTTIMEFORMAT='%F %T '
    4  2017-08-23 16:38:52 cal
    5  2017-08-23 16:38:56 date
    6  2017-08-23 16:39:06 fuser -v /bin/bash
    7  2017-08-23 16:39:14 printenv
    8  2017-08-23 16:39:19 hostname
    9  2017-08-23 16:39:22 free
   10  2017-08-23 16:39:30 history

こんな感じで、日時が表示されましたよね。こうしておけば、「○月○日の○時ごろに実行したコマンドは何だっけ」というときに、調べやすくなります。「history | less」として検索したり、以下のようにgrepしてもいいですね。

history | grep -E '2017-08-23 1[4-6]'

ただし、「HISTTIMEFORMAT」を設定する前のコマンドにも日時が表示されていますが、これは正しくありませんので注意してください。

コマンドを実行した日時を保存しておいて損はなさそうなので、常に「HISTTIMEFORMAT」を設定しておきたいですよね。なので、~/.bashrcに追記しておきましょう。以下のようにリダイレクトしてもいいですし、エディタで追記してもいいでしょう。そうすれば、端末を開いたら自動的に設定されます。

echo "export HISTTIMEFORMAT='%F %T '" >> ~/.bashrc

コマンドの履歴を保存しているファイルは「.bash_history」ですが、このファイルにどのように日時が保存されているかも見てみましょう。通常、このファイルに履歴が追記されるのはシェルを終了する時なので、以下のコマンドですぐに追記してみましょう。

history -a

そして、「.bash_history」の中身を見ると以下のようになっているはずです。

$ cat .bash_history
passwd
history
#1503473527
export HISTTIMEFORMAT='%F %T '
#1503473932
cal
#1503473936
date
#1503473946
fuser -v /bin/bash
#1503473954
printenv
#1503473959
hostname
#1503473962
free
#1503473970
history
#1503475170
echo "export HISTTIMEFORMAT='%F %T '" >> ~/.bashrc
#1503475195
history -a

「export HISTTIMEFORMAT='%F %T '」を実行してから、「#数値」の行が入るようになっていますよね。これは日時を「UNIX時間」で表したものです。これが「HISTTIMEFORMAT」で指定した形式に変換され、出力されているわけですね。

なお、「HISTTIMEFORMAT」でのフォーマット指定に使用できる文字列は、C言語の「strftime」で用いられるものです。通常はこのページの例のままで問題ないと思いますが、好みに応じて変更することもできます。