複数のセッションを実行しているときの奇妙なbash履歴動作


15

複数のターミナルウィンドウを使用する場合、コマンドラインの履歴はどのように保存されますか?それが保存されていることは知って.bash_historyいますが、新しいウィンドウを開くと、どの履歴が使用されているかのロジックを見ることができません。新しいウィンドウで上矢印を使用しようとすると、どのコマンドが表示されるかわからないという意味で、ほとんど決定的ではありません。

誰かがこれを説明できますか?

特定のウィンドウから履歴を再利用できるように、履歴を制御する方法はありますか?

回答:


14

bash履歴の動作を理解するには、まず次のことを知る必要があります。

  1. 履歴ファイルには履歴があります。
  2. bashプロセスの記憶には歴史があります。
  3. 1つのbashプロセスのメモリ内の履歴は、他のbashプロセスのメモリ内の履歴と同期しません。
  4. bashプロセスのメモリ内の履歴は、特定のイベントに対して明示的に要求されない限り、または特定のイベント中にファイルの履歴と同期されません(以下を参照)。

デフォルト設定を使用した場合、履歴に関するbashセッションのライフサイクルは次のとおりです。

  1. 起動中にbashは履歴ファイルを読み取ります。履歴ファイルの内容は、bashプロセスのメモリ内にあります。
  2. 通常の使用時には、メモリ内の履歴のみが操作されます。
  3. シャットダウン中に、メモリ内の履歴が履歴ファイルに書き込まれ、履歴ファイルの以前のコンテンツが上書きされます。

観察した一見非決定的な動作は、ほとんどの場合、履歴ファイルの内容は常に最後に閉じたbashセッションの履歴であり、bashは起動時にのみ履歴ファイルを読み取るためです。

起動およびシャットダウンプロセスの詳細については、bashのマニュアルを参照してください。

デフォルト設定では、bashのデフォルト設定を意味することに注意してください。ディストリビューションは、この動作を変更する.bashrc(または/etc/bash.bashrc)を提供している場合があります。

シェルオプションhistappendを有効にすると、bashに履歴ファイルを上書きする代わりに追加するように指示できます。histappendコマンドを使用して有効にすることができshopt -s histappendます。このオプションを常に有効にするには、コマンドを.bashrc(または他の初期化ファイル)に入れる必要があります。shoptコマンドの詳細については、bashマニュアルを参照してください

有効histappendにしても、一見非決定的な動作が大幅に減少することはありません。これは、すべてのbashセッションがメモリ内に独自の履歴を保持しているためです。ほとんど同期されたbash履歴を持つことが可能です。スタックオーバーフローのスレッドですべてのbashプロセスがほとんど同期された履歴を取得する方法についてのガイドがあります

組み込みコマンドhistoryを使用すると、bashにファイルからメモリへの履歴の読み取り、またはメモリからファイルへの書き込みを明示的に指示できます。たとえばhistory -r、ファイルの内容を読み取り、メモリ内の履歴に追加します。history -w現在の履歴をメモリからファイルに書き込み、以前のコンテンツを上書きします。これは基本的にシャットダウン中に起こることです。historyコマンドの詳細については、bashマニュアルを参照してください

完全を期すために、履歴の動作を変更する内部変数のリストを次に示します。

  • HISTFILE:履歴を読み書きするファイル。
  • HISTFILESIZE:履歴ファイルの最大行数。
  • HISTSIZE:メモリ内の履歴の最大行数。
  • HISTCONTROLHISTIGNOREHISTTIMEFORMAT:この議論には関係ありません。詳細については、bashのマニュアルを参照してください。

良い説明。シャットダウンについて言及しましたが、ターミナルセッションを強制終了するのはどうですか?セッションは、ログアウトまたはUIを介して、またはネットワーク接続の切断などの他の手段を介して強制終了できます。履歴ファイル全体が置き換えられ、複数のセッションがある場合、最後に閉じたセッションの履歴が履歴ファイルで使用されると言っていますか?それは、非決定論的な動作を説明できます。
アレックスギテルマン

ライフサイクルポイント(3)が正しくありません。最初のbashセッションのみが履歴ファイルに書き込みを行うようです。テスト:2つのセッションを順番に開きます。a、b。bで 'echo hello'を実行します。次にbで終了します。次に、新しいセッションを開きますc。このセッションの履歴にはecho helloはありません。
user606723

@AlexGitelman:bashプロセスが強制終了すると、履歴ファイルを上書きする機会がなくなります。はい、最後に閉じたセッションの履歴が履歴ファイルに記録されます。
レスマナ

@ user606723:ポイント3は正しいです。bashのマニュアルを読んでください。最小限の.bashrcファイルを使用してもう一度実験してください。ディストリビューションによっての設定が一部変更されている可能性があることに注意してください/etc/bash.bashrc。特にシェルオプションを確認してくださいhistappend
レスマナ


0

知る限り、bashコマンドはSSHセッションが終了した後に保存されます。そのため、セッションが異常終了した場合(ネットワーク障害など)、コマンドは保存されません。私はここでSSHセッションについて話しています。ローカル端末も同様のアプローチを使用できます。

複数のセッションを同時に開くと、一方のセッションで入力されたコマンドは、両方がアクティブである間、他方で表示されません。ただし、セッションを終了して再度開くと、これらのコマンドが表示されます。


これは私が経験した動作ではありません。これを確認するには、sshセッションを開いてコマンドを実行し、正常に終了するクイックテストを実行します。この場合、以前アクティブだった別のsshセッションがありました。この既存のbashセッションでは、.bash_historyを確認しても、何も記録されていません。実行中の最初のbashセッションが.bash_historyに記録される唯一のセッションである可能性があります。
user606723

セッションを終了しても、現在実行中のセッションには影響しませんが、新しいセッションには影響します!
カレド

UIで閉じるのがSSHではなくGnomeターミナルウィンドウの場合はどうなりますか?
アレックスギテルマン

検証する必要があります。現在、Gnomeターミナルにアクセスできません!
カレド

@Khaled、テスト済み、新しいセッションには影響しません。(bashが新しいセッションのコマンド履歴を取得する場所である前に.bash_historyをチェックしました。うまくいかないことはわかっていましたが、とにかくユーモアをかけました。)
user606723
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.