• Windows Subsystem for Linuxガイド 第40回 Bashのヒストリ機能 その2「設定編」

前回の続きで、bashのヒストリ関連の機能を解説する。今回は、ヒストリ機能関連のコマンドとbashのヒストリ機能設定に関してである。

ヒストリ関連コマンド

ヒストリ関連のコマンドとしては、「fc」および「history」の2つがある。なお、どちらもbashの組み込みコマンド(builtins)であり、実行ファイルは存在しない。基本的な使い方はbuiltins manページ(あるいは、man fcやman history)で調べることができる。

historyはその名前の通り履歴リストの表示や制御を行うためのコマンド(表01)。ヒストリのリスト表示やファイルへの保存、履歴項目の追加や削除といった作業を行うことができる。とりあえず、履歴リストを見る、検索するなどは、historyコマンドで対応できる。

「-p」オプションは、履歴展開の結果を調べたい場合に使う。このオプションを付けたとき、単に履歴展開されたコマンドが表示されるだけで、このコマンド自体、履歴リストに入らない。ただし、コマンドラインはすべて実行前に履歴展開が行われるため、引数はシングルクオートでくくる必要がある。履歴展開の"p"修飾子と同じものだ。なお、スペースで区切った引数は出力時には、個別の行として出力される。

「-a」、「-c」、「-r」オプションは、履歴リストの保存、クリア、再読み込みを実行する。

fcコマンドは、Fixコマンドと呼ばれており、簡単にいうと、ヒストリエントリから複数のコマンドを連続実行するためのものだ(表02)。fcコマンドは、範囲指定した履歴リストをエディタに読み込む、編集後にエディタで保存して終了を選択すると、編集した履歴リストが実行される。

-lオプションは、履歴リストを表示するだけの場合に使い、-sオプションは単独のコマンドを履歴リストから選択(コマンド先頭文字列またはコマンド番号)して、実行するときに利用する。

ヒストリ機能を制御するためのシェル変数

ヒストリ機能に関しては、設定により動作を変更することができる。一部の設定では、シェル変数、あるいは環境変数を使う。表03は、ヒストリに関連のシェル変数、環境変数の一覧である。bashのシェル変数、Linuxの環境変数では、大文字小文字が区別されることに注意されたい。シェル変数を定義するには、


<変数名>=<値>

とする。

ヒストリ機能は、基本的にbashの機能なので、設定値としては、シェル変数でかまわない。ただし、環境変数として定義しても問題ない。ログインシェルで使っていると両者の間には、違いはない。子プロセスからさらにbashを起動するといった場合、環境変数であれば、子プロセスにも環境変数が継承されるが、シェル変数の場合、ログインシェルでの設定状態が継承されない場合がある。

子プロセスで実行するシェルでもログインシェルと同様のヒストリ機能を使いたい場合、環境変数として定義し、ログイン時に一回だけ実行される「~/.profile」、「~/.bashprofile」、「~/.bashlogin」のどれかを使う。Linuxディストリビューションにより違いがある。

「~/.bashrc」は、bashが起動するときに毎回読み込まれるため、ここで設定すると、親プロセスの状態に関わりなく、毎回同じ設定値が維持されてしまう。

環境変数を使うなら、ログイン時に1回だけ実行される「~/.profile」などに記述する。このようにすることで、たとえば親プロセスで手動で環境変数を変更した場合、それが子プロセスにも継承される。

環境変数として定義する場合、exportコマンドを使い


export <変数名>=<値>

とし、環境変数、シェル変数を消去する場合には、


unset <変数名>

とする。

ヒストリ機能のシェル変数である「HISTTIMEFORMAT」を設定すると、履歴リストファイルに日時が記録されるようになる。設定には「%F %T 」の様な日時の書式パターンを指定する。このとき、履歴リストファイルはコマンドと日時が2行で記録されるため、HISTFILESIZEで指定された行数の半分のイベントしか記録できなくなる。

シェルオプションによるヒストリ機能の設定

シェルオプションは、shoptコマンドを使い、以下の構文で有効化する。


shopt -s <シェルオプション名>

解除するには、


shopt -u <シェルオプション名>

とする。

シェルオプションは、デフォルトでは、すべて解除(無効)に設定されている。(表04)にヒストリ機能関連のシェルオプションを示す。

このうち、ヒストリ機能の動作に大きく関係するのが「histreedit」と「histverify」だ。前者は、ヒストリ置換が失敗した場合にコマンドラインを編集状態にする。たとえば、「!xyz」としてxyzで始まるコマンドを使ったイベントを参照しようとして、履歴リストに該当するものがなかったとき、コマンドラインは再度編集状態となる。

これに対して「histverify」は、ヒストリ置換の結果を即座に実行せず、置換したコマンドラインを一回、編集状態にする。コマンドラインを編集したあとEnterキーで実行できる。

どちらも結果を見てから実行できるため、ヒストリ置換に慣れない段階では設定しておくと実行前に確認できるので安心感がある。

histappendは、シェルの終了時に履歴リストを履歴リストファイルに追記する。このオプションが無効なときには、履歴リストファイルを上書きする。

(リスト01)に、ヒストリ関連の設定値のサンプルを示す。

■リスト01


# 履歴展開を確認(編集)してから実行
shopt -s histappend
shopt -s histreedit

# ヒストリ機能関連のシェル変数を環境変数として指定
export HISTFILE=~/.myhistory/.bash_history
export HISTCONTROL='ignoreboth:erasedups'
export HISTIGNORE='ls:ls *:history:history *:pwd'
export HISTTIMEFORMAT='%F %T '
export HISTFILESIZE=3000
export HISTSIZE=1000

# fcコマンド用
export EDITOR='vi'
# EDITORを使うなら以下も必要になることがある
export VISUAL='vi'

ヒストリ機能は、キー入力を減らし、長いパスなどを再入力せずに済み、誤入力を減らすこともできる。ヒストリ機能を使いこなすことで、コマンドラインの使い勝手がまったく違ってくる。キーストローク数で比較すれば、ヒストリ機能を使うかどうかで、数倍の違いが出ることも少なくないからだ。

Windows Subsystem for Linuxガイド 連載バックナンバー
https://news.mynavi.jp/tag/winsubsystem/