複数の端末でのBash履歴処理


110

私は主にターミネーターを使用していますが、通常は3つのターミナルウィンドウで開きます。さまざまな理由でGnome端末も使用しています。
実行時に以前に発行されたコマンドを見逃すことがあるため、この場合、bash履歴はどのように処理されるのでしょうかhistory

たとえば、プロンプトには現在のbash履歴行(\!)が表示され、3つの端末ウィンドウを分割してTerminatorを起動すると、すべての端末で同じ履歴行(たとえば100)が表示されます。どの履歴が保存されますか?

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


回答:


107

保存されるbashセッションは、最後に閉じられた端末のセッションです。すべてのセッションのコマンドを保存する場合は、ここで説明するトリックを使用できます。

export PROMPT_COMMAND='history -a'

マンページを引用するには:「設定されている場合、値は各プライマリプロンプトを発行する前にコマンドとして実行されます。」

したがって、コマンドが終了するたびに~/.bash_history、プロンプト($ PS1のみ)を再度表示する前に、書き込まれていない履歴項目を追加します。

そのため、その行を/etc/bash.bashrc入力した後、私は自分の端末を怠っていたからといって、車輪を再発明したり、貴重な秒数を再入力したりする必要はありません。

とにかく、異なるセッションからのコマンドが履歴ファイルに混在するので、後で読むのはそれほど簡単ではないことを考慮する必要があります。

こちらもご覧ください:


TTLごとに別々に保存されていませんか?
ヴィネートメノン

優れた。説明と解決策をありがとう。私は試してみましたがexport PROMPT_COMMAND='history -a; history -r'、端末でいくつかの奇妙な履歴行番号を取得しました-コマンド履歴の行番号を1つではなく2000でジャンプした後、奇妙ですが、前述のように動作します-すべての端末の履歴が保存されます。
ゼータ

詳細について@VineetMenonを見てここに。興味深い部分:シェルが起動すると、履歴はHISTFILE変数で指定されたファイルから初期化されます(デフォルトは `〜/ .bash_history ')。[...]対話型シェルが終了すると、最後の$ HISTSIZE行が履歴リストから$ HISTFILEで指定されたファイルにコピーされます。
jcollado

このウェブサイトがダウンしているようだ:northernmost.org/blog/flush-bash_history-after-each-command
Shubham


32

を複数回読み取った後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
sudo mountソートチェーンなどに最初の引数を含めるため)。


3
なぜHISTFILESIZE2回割り当てるのですか?
ダニエル

2
HISTFILESIZEを0に設定することにより、履歴バッファーをクリアし、履歴保存メカニズムをリセットします。次に、本当に必要なサイズを設定し、HISTFILEに履歴の保存を開始します。の履歴セクションをご覧くださいman bash
ワルチネーター

1
Ctrl+r再び機能させるために履歴ファイルをマージする方法はありますか?
n611x007

3
これは新しい質問であるべきですが、良いアイデアだとは思いません。私が使用egrep 'whatever' .history/*(またはcat .history/* | egrep 'whatever')その代わり、および個々のセッションの履歴を検索するには、Ctrl-Rを使用します。man bash-builtinshistoryコマンドについて読んでください。私sort .history/* | uniq -c | sort -n | wc -lは16033個のユニークなコマンドをcut '-d ' -f1 .history/* | sort | uniq -c | sort -n表示し、2004年のユニークなコマンドを表示します。これらすべてをbashの「履歴リスト」にロードしても役に立ちません。
ワルチネーター

@waltinator-これは古いコメントであることは知っていますが、環境変数を設定するとすぐにアクションがトリガーされることを意味していますか?ローカルシェルでHISTFILESIZEに値0を割り当てた後、すぐに4096に変更するという事実をどのプロセスが取得しますか?これは特定の変数名のbashの処理について文書化されていないものですか?
非同期の

8

historyすべての端末から表示するには:

export PROMPT_COMMAND='history -a; history -r'.bashrcファイルに追加します。

ソース:http : //northernmost.org/blog/flush-bash_history-after-each-command



3
私はこれを数ヶ月使用した後、つい最近これをコメントアウトしたと言います。Tmuxペインで最初に実行したコマンドを実行するために最後の100個のコマンドをふるいにかけたいとは限らないため、それはほろ苦いです。
イライジャリン

魚の甲羅が提供する素晴らしい解決策はであるhistory --merge。私は今これを1年かそこら使用しており、問題を解決しています。他のセッションの最新の履歴が必要な場合は、そのコマンドを実行するだけですぐに使用できます。
イライジャ・リン

エクスポートは必要ありません。
制限されたA罪

6

別の代替手段については、「永続的な履歴をbashに保持する」も参照してください。それは、これまでに入力されたすべてのコマンド送信するようにプロンプトリグ任意の(通常は定期的に行われているものと一緒に「永続履歴」ファイルにターミナルを.history)。


1
行を作成するために$$を挿入しました。echo $$ $date_part "$command_part" >> ~/.persistent_historyこれにより、複数の履歴を解くことができるように、bashプロセスのPIDをエントリの前に付けます。
エフゲニーセルゲイエフ

CTRL-R履歴検索で動作する代替履歴を作成できますか?
最大
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.