Linux ディストリビューションのコマンド実行履歴まわりについて理解を深めるために動作を調べたのでまとめておく。 主にコマンド実行履歴を残すファイルの指定方法とか history コマンドについて。
今回使った環境は次の通り。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=14.04 DISTRIB_CODENAME=trusty DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS" $ uname -r 3.19.0-25-generic
コマンド実行履歴の保存先
まず、コマンド実行履歴が保存されるファイルの名前はシェル変数の HISTFILE で指定する。 シェル変数の一覧から HISTFILE を検索すると次のように見つけることができる。 また、保存する件数については HISTFILESIZE で指定するようだ。
$ set | grep HISTFILE HISTFILE=/home/vagrant/.bash_history HISTFILESIZE=2000
ちなみに、この変数は環境変数ではないらしい。 環境変数の一覧を検索しても見つからない。
$ env | grep HISTFILE
シェル変数と環境変数の違いについては、こちらのエントリに書いた。
シェル変数の HISTFILE で指定されているファイルを開くとコマンド履歴が残っている。 こうすれば直接 ~/.bash_history なんかを指定するよりも汎用性が高くなりそうだ。
$ tail -n 3 $HISTFILE sudo apt-get update && sudo apt-get upgrade -y sudo apt-get dist-upgrade -y sudo shutdown -r now
上記を見ると、ここまで色々なコマンドを実行してきた割に、最後に実行したコマンドが shutdown のように見える。 これは実行したコマンドが HISTFILE へすぐには反映されないことが理由になっている。 実際に HISTFILE へ書き出されるのはログアウトのタイミングだ。
コマンド実行履歴の保存先を変更してみる
試しにコマンド実行履歴の保存先を変更してみよう。 これにはシェル変数の HISTFILE を変更する。
$ HISTFILE=/home/vagrant/.my_history
コマンド実行履歴が書き出されるように一旦ログアウトしよう。
$ exit
再度ログインすると、先ほど指定した名前のファイルができている。
$ ls -a ~/ | grep .my_history
.my_history
内容を見ると確かに先ほど実行した内容が保存されている。
$ tail -n 3 ~/.my_history tail -n 3 $HISTFILE HISTFILE=/home/vagrant/.my_history exit
history コマンド
ファイルに書き出される前にここまで実行してきたコマンドの履歴を見るには history コマンドを使う。
$ history | tail -n 3 179 ls -a ~/ | grep .my_history 180 tail -n 3 ~/.my_history 181 history | tail -n 3
履歴をすべて消去するには -c オプションをつけて実行しよう。
$ history -c
再度 history コマンドを実行すると履歴が消えていることがわかる。
$ history 1 history
また、特定の履歴をピンポイントで削除するには -d オプションで履歴の番号を指定する。
$ history -d 1
再度 history コマンドを実行すると -d オプションをつけて実行する前にあったコマンドの履歴が消えている。
$ history 1 history -d 1 2 history
いじょう。