CUBE SUGAR CONTAINER

技術系のこと書きます。

Linux ディストリビューションのコマンド実行履歴について

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

シェル変数と環境変数の違いについては、こちらのエントリに書いた。

blog.amedama.jp

シェル変数の 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

いじょう。