複数のターミナルウィンドウを使用する場合、コマンドラインの履歴はどのように保存されますか?それが保存されていることは知って.bash_history
いますが、新しいウィンドウを開くと、どの履歴が使用されているかのロジックを見ることができません。新しいウィンドウで上矢印を使用しようとすると、どのコマンドが表示されるかわからないという意味で、ほとんど決定的ではありません。
誰かがこれを説明できますか?
特定のウィンドウから履歴を再利用できるように、履歴を制御する方法はありますか?
複数のターミナルウィンドウを使用する場合、コマンドラインの履歴はどのように保存されますか?それが保存されていることは知って.bash_history
いますが、新しいウィンドウを開くと、どの履歴が使用されているかのロジックを見ることができません。新しいウィンドウで上矢印を使用しようとすると、どのコマンドが表示されるかわからないという意味で、ほとんど決定的ではありません。
誰かがこれを説明できますか?
特定のウィンドウから履歴を再利用できるように、履歴を制御する方法はありますか?
回答:
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
:メモリ内の履歴の最大行数。HISTCONTROL
、HISTIGNORE
、HISTTIMEFORMAT
:この議論には関係ありません。詳細については、bashのマニュアルを参照してください。.bashrc
ファイルを使用してもう一度実験してください。ディストリビューションによっての設定が一部変更されている可能性があることに注意してください/etc/bash.bashrc
。特にシェルオプションを確認してくださいhistappend
。
http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
端末の1つで履歴ファイルの書き込み方法を操作できる場合があります。つまり、履歴を保存する端末で「history -a」または「history -w」を実行し、次に「history -r」を実行します他の端末。何をしたいかによって異なります。
知る限り、bashコマンドはSSHセッションが終了した後に保存されます。そのため、セッションが異常終了した場合(ネットワーク障害など)、コマンドは保存されません。私はここでSSHセッションについて話しています。ローカル端末も同様のアプローチを使用できます。
複数のセッションを同時に開くと、一方のセッションで入力されたコマンドは、両方がアクティブである間、他方で表示されません。ただし、セッションを終了して再度開くと、これらのコマンドが表示されます。