Macとかの雑記帳

ターミナルのタブを複数開いてもコマンドの履歴を共有させる方法

ターミナルで複数のタブを開いて作業していると、別タブで実行したコマンドを見たい時があるですが、bashはタブを開き直さないとコマンドの履歴が共有されませんので結構不便だったりします。

zshに乗り換えれば解決するのですが、bashでもリアルタイムで履歴を共有させる方法ってあったんですね。結構昔に紹介された技なのですが、知らなかったので備忘録。

bashデフォルトでは履歴が共有されない問題

下は、タブを二つ開き、左側のタブで適当なコマンド「echo 1~3」を実行した後、historyを実行して履歴を表示させたところです。

bash_history1

当然ですが、実行したコマンドが履歴に表示されます。

次に右側のタブに移動し、適当に「echo 4~5」を実行してから、historyで履歴を表示します。

bash_history2

このタブで実行したコマンドは表示されますが、先ほど左側のタブで実行したコマンドは履歴に表示されません。

全ての履歴を表示させたい場合は、タブを全て閉じて開き直せば表示されますが、実用的ではないと思います。

bash_history3

コマンド履歴を共有させる

bashで履歴を共有させるには、~/.bashrcに以下の設定を追加します。

function share_history {
 history -a
 history -c
 history -r
}
PROMPT_COMMAND='share_history'
shopt -u histappend

一番下のshopt -u histappendは、タブを全て閉じて開き直しても、履歴が共有されない古いbashで必要な設定です。最近のbashではデフォルトで有効になっているようなので、この設定は必要ないと思います。

追加したら、タブを開き直すか、下記を実行して設定を反映させます。

$ source ~/.bashrc

注意

便利な技なのですが、コマンドを実行するたびに履歴(.bash_history)を読み込み直してるので、履歴数(HISTSIZE)が多いと、ターミナルのレスポンスが悪くなっていきます。

どのくらいの履歴数で影響し始めるのかを私の環境(Core 2 Duo、メモリ4GB、OS X 10.7.2)で試したところ、履歴数20万くらいからプロンプトの表示が一瞬遅れるようになりました。

使用している機種のスペックによって変わってくるかもしれませんが、ターミナルのレスポンスを落とさずこの技を使うのであれば、履歴数の上限は10万くらいを目安に設定されると良いと思います。

参考LINK:iandeth. - bashにて複数端末間でコマンド履歴(history)を共有する方法

スポンサード リンク