複数端末によるBashの履歴処理

私は主にターミネーターを使用しており、通常3つの分割されたターミナルウィンドウで開いています。また、様々な理由からGnomeターミナルも使用しています。
この場合、bashの履歴はどのように処理されるのでしょうか。

例えば、私のプロンプトには現在のbashの履歴行(`)が表示されていますが、ターミナルウィンドウを3つに分割してターミネーターを起動すると、すべてのターミナルで同じ履歴行(仮に100とする)が表示されます。どの履歴が保存されるのでしょうか?

また、Terminatorを使用した後にGnome Terminalを起動すると、Terminatorで以前に発行されたすべてのコマンドに関係なく、起動時に100行目が表示されます。

ソリューション

保存されるbashセッションは、最も遅く閉じた端末のものです。もし、セッションごとにコマンドを保存したい場合は、こちらで説明したトリックを使うとよいでしょう。

export PROMPT_COMMAND='history -a'

manpageを引用します。"設定すると、各プライマリプロンプトを発行する前に、この値がコマンドとして実行されます。"

そのため、コマンドが終了するたびに、プロンプト($PS1のみ)を再度表示する前に、~/.bash_historyに未執筆の履歴項目を追記します。

この行を /etc/bash.bashrc に入れたら、端末の扱いが悪いからといって、車輪を再発明したり、貴重な数秒を再入力する必要がなくなりました。

ただし、履歴ファイルには異なるセッションのコマンドが混在するため、後で読むのが面倒になることを考慮する必要があります。

こちらもご覧ください。

解説 (6)

man bashを何度も読み返した結果、私はシェルごとに別々の履歴ファイルを使用しています。mkdir -m 0700 ~/.history とやって、その中に

[[ -d ~/.history ]] || mkdir --mode=0700 ~/.history
[[ -d ~/.history ]] && chmod 0700 ~/.history
HISTFILE=~/.history/history.$(date +%y%b%d-%H%M%S).$$
# close any old history file by zeroing HISTFILESIZE  
HISTFILESIZE=0  
# then set HISTFILESIZE to a large value
HISTFILESIZE=4096  
HISTSIZE=4096  

を私の ~/.bashrc に追加しました。時々、du -sk .historyを実行して、それを掃除するのを忘れないようにします。このように、自分が入力したすべてのコマンドを保存しておくのはいいことです。

最近、自分が何をしていたかを確認するために、上記を使用したところです。 cut -f1 "-d " .history/* | sort | uniq -c |sort -n -r |less. または cut -f1-2 "-d " .history/* | sort | uniq -c |sort -n -r |less とする。 (第 1 引数、例えば sudo mount をソートチェーンに含めるため)。

解説 (7)

すべての端末から history を表示する。

.bashrc ファイルに export PROMPT_COMMAND='history -a; history -r' を追加してください。

出典http://northernmost.org/blog/flush-bash_history-after-each-command


解説 (3)