GNU/Linux >> Linux の 問題 >  >> Linux

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

解決策 1:

最初に bash 履歴の動作を理解するには、次のことを知っておく必要があります:

<オール>
  • 履歴ファイルに履歴があります。
  • bash プロセスのメモリには履歴があります。
  • 1 つの bash プロセスのメモリ内の履歴は、他の bash プロセスのメモリ内の履歴と同期されません。
  • bash プロセスのメモリ内の履歴は、ファイル内の履歴と同期されません。ただし、明示的に要求された場合、または特定のイベント中に同期された場合を除きます (以下を参照)。
  • デフォルト設定を使用すると、履歴に関する bash セッションのライフサイクルは次のようになります:

    <オール>
  • 起動時に、bash は履歴ファイルを読み取ります。履歴ファイルの内容は現在、bash プロセスのメモリにあります。
  • 通常の使用では、メモリ内の履歴のみが操作されます。
  • シャットダウン中に、メモリ内の履歴が履歴ファイルに書き込まれ、履歴ファイルの以前の内容が上書きされます。
  • あなたが観察した一見非決定論的な動作は、ほとんどの場合、履歴ファイルの内容が常に最後に閉じられた 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 のマニュアルをお読みください。

    解決策 2:

    http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

    いずれかの端末で履歴ファイルの書き込み方法を操作できる場合があります。つまり、履歴を保存する端末で「history -a」または「history -w」を実行し、次に「history -r」を端末で実行します。他の端末。何をしたいかによります。


    Linux
    1. 複数のターミナルウィンドウでBashの履歴を保持しますか?

    2. 1つのターミナルを終了するときに他のターミナルのBash履歴を更新しますか?

    3. 複数のターミナルタブを開いてコマンドを実行しますか?

    1. Bash History:各コマンドが実行された時のタイムスタンプ (日付/時刻) を表示する方法

    2. 方法:無制限の Bash/シェル履歴?

    3. セッション間で bash 履歴を保持するにはどうすればよいですか?

    1. LinuxでBashの履歴をクリアする方法

    2. bashで実行可能スクリプトを実行するときにドットスラッシュを回避する方法はありますか?

    3. NetCat (nc) の実行中に複数のポートを調べる