はじめに
普段開発をしていると、ターミナルを複数開いて作業することが多いと思います。しかし、デフォルトのBash設定では、各セッションで打ったコマンドの履歴が独立しており、別のターミナルで使った便利なコマンドを再度入力する必要があります。
この記事では、そんな煩わしさを解消するため、複数のセッションでコマンド履歴をリアルタイムに共有する方法を解説します。読み終えると、どのターミナルからでも最新のコマンド履歴にアクセスできるようになります。
前提知識
- Bashの基本的な使い方(ターミナルを開いてコマンドを打てる)
.bashrcや.bash_profileなどの設定ファイルを編集した経験があると尚良い
なぜ履歴を共有したいのか
Linux/macOSでBashを使っていると、以下のような悩みを抱えていませんか?
- ターミナルAで実行した
git log --graph --onelineを、ターミナルBで↑キーで呼び出したい - シェルを再起動したら直前の履歴が消えてしまう
- 複数人で同一サーバにログインしているとき、他の人の便利コマンドが見たい
履歴を共有することで、作業効率が大幅に向上します。特に、CI/CD用のサーバやコンテナ開発環境では、同じコマンドを何度も打つのは時間の無駄です。
リアルタイム履歴共有の設定手順
ステップ1:履歴ファイルの即時書き込みを有効にする
デフォルトでは、Bashはセッション終了時まで履歴をメモリ上に保持します。これを即座にファイルに書き込むことで、他のセッションからも参照できるようにします。
.bashrc に以下を追記してください:
Bash# 即座に履歴ファイルに書き込む shopt -s histappend # 履歴ファイルのパスを明示(デフォルトは~/.bash_history) HISTFILE="$HOME/.bash_history" # 毎コマンド実行後に履歴を読み直す PROMPT_COMMAND='history -a; history -n'
PROMPT_COMMAND はプロンプトが表示されるたびに実行される特殊な変数です。history -a で現在のセッションの履歴をファイルに追記し、history -n でファイルに追加された他セッションの履歴を読み込みます。
ステップ2:履歴サイズと重複排除を最適化する
履歴が多すぎると読み込みが遅くなるため、サイズを調整します。また、同じコマンドが連続して記録されるのを防ぎます:
Bash# メモリ上に保持する履歴数(デフォルトは500) HISTSIZE=10000 # ファイルに保存する履歴数 HISTFILESIZE=20000 # 重複削除とスペースから始まるコマンドは記録しない HISTCONTROL=ignoreboth # タイムスタンプを記録 HISTTIMEFORMAT='%F %T '
ignoreboth は ignorespace(スペースから始まるコマンドを記録しない)と erasedups(履歴内の重複削除)を同時に有効にします。
ステップ3:設定の即時反映と動作確認
設定を読み込み、動作を確認しましょう:
Bash$ source ~/.bashrc $ echo $$ # セッションAのPID 1234 $ echo "hello from A"
別のターミナル(セッションB)で:
Bash$ tail -1 ~/.bash_history echo "hello from A" $ echo "hello from B"
セッションAに戻り、↑キーで履歴を呼び出すと、「hello from B」が表示されれば成功です。
ハマった点:履歴が逆順に表示される
複数セッションで同時にコマンドを打つと、時系列が崩れることがあります。これは、history -n がファイル末尾から読み込むためです。
回避策として、以下の関数を .bashrc に追加すると良いです:
Bashsync_history() { history -a history -c history -r } alias hsync='sync_history'
hsync を実行すると、履歴が完全に同期されます。CIパイプラインなどで重要なコマンドを実行する前に叩くと安心です。
まとめ
本記事では、Bashで複数セッション間でコマンド履歴をリアルタイムに共有する方法を解説しました。
shopt -s histappendとPROMPT_COMMANDで即時書き込み・読み込みを実現HISTSIZE/HISTFILESIZEで履歴サイズを最適化HISTCONTROL=ignorebothで履歴の質を向上
設定を行うことで、どのターミナルからでも最新のコマンド履歴にアクセスでき、作業効率が大幅に向上します。
次回は、tmux + Bashでサーバ内の全ペインで履歴を完全に同期する方法を紹介します。
参考資料
