MENU

bashでターミナル間の履歴を共有する方法

bash の履歴は通常、各ターミナルが独立して管理しており、複数のウィンドウを開いて作業していると、過去に実行したコマンドが別のターミナルに反映されず不便である。この問題は、bash が履歴ファイル(一般に ~/.bash_history)を読み書きするタイミングが限られていることに起因する。

デフォルトでは、ターミナル終了時に履歴が書き込まれる仕様であり、そのためリアルタイムの共有は行われない。本稿では、この挙動を変更し、どのターミナルからも最新履歴を利用できる環境を構築する方法について解説する。

目次

履歴共有の仕組み

bash に対して「履歴をリアルタイムに書き込み、かつ常に読み込む」ことを明示的に指示する。bash には PROMPT_COMMAND という特別な環境変数が存在し、これはプロンプトが表示される直前に bash が必ず実行するコマンド列を定義する。

履歴同期のためには、この仕組みを利用して、直前のコマンドを履歴ファイルに追記する history -a を実行し、他ターミナルが書き込んだ履歴を読み込む history -n を実行するという二段構えが必要になる。また、履歴ファイルの内容を上書きせず追記する histappend を有効にすることで、複数ターミナルが同時に履歴を書いても衝突が起こらない。

実装方法

履歴共有の設定は .bashrc に記述することで有効になる。.bashrc はログインシェルでなくとも読み込まれるため、複数ターミナルで開く通常の対話型シェルの設定として適切である。以下に示す設定を追記すれば、ターミナルを跨いで履歴が共有される。

shopt -s histappend
export PROMPT_COMMAND="history -a; history -n"

この設定を追加したら、source ~/.bashrc を実行して反映させる。

強制同期が必要な場合(オプション)

履歴の衝突や順序の乱れが気になるような環境では、より強制的な同期方法として history -c を併用する設定がある。これは一度メモリ上の履歴を全消去し、その後ファイルから再度読み込むため、最新状態が常に正確に再現される。設定は以下のとおりである。

export PROMPT_COMMAND="history -a; history -c; history -n"

ただし、この手法は履歴の並びが不自然になりやすいなどの副作用があるため、常用するというよりは、履歴を厳密に同期させたい特定の場面でのみ利用すべきである。

目次