時々、コマンド履歴は.bash_historyに保存されません。

時々、コマンド履歴は.bash_historyに保存されません。

昨日私はCentOS 7で多くのコマンドを実行しました。ところで、今日このコマンドを検索しようとしたときに記録がないことがわかりました。ファイルを開いてみると、昨日の命令.bash_historyはまだ見つかりませんでしたが、数日前の古い命令はたくさん見つかりました。最近のコマンドが保存されないのはなぜですか?履歴記録機能を向上させるには?

答え1

履歴エントリが表示されない最大の理由は、空またはゼロに設定されておらず、同じシステムに2回ログインし、2番目のbashインスタンス(ほとんど何もしなかっHISTFILEHISTSIZE)の後に終了したためです。たくさん。デフォルトでは、Bashは履歴をマージせず、2番目のBash終了は.bash_history最初のBash終了によって適切に更新された履歴を上書きします。

これが発生しないようにするには、履歴ファイルを上書きするのではなく、履歴ファイルに追加できます。histappendシェルオプションを使用できます。

histappendシェルオプションが有効になっている場合(以下のSHELL BUILTIN COMMANDSの下のshoptの説明を参照)、この行は履歴ファイルに追加され、それ以外の場合は履歴ファイルが上書きされます。

詳細については、次を参照してください。この回答使用方法HISTSIZE、サイズHISTFILESIZE制御HISTCONTROL、重複などが含まれています。

答え2

履歴サイズを変更するには、HISTSIZE2つのBASH変数HISTFILESIZE(通常はで設定されています.bashrc)を使用します。

BASHのマニュアルページの説明:

歴史的規模 コマンド履歴に覚えておく必要があるコマンドの数(下記の「記録」を参照)。値が 0 の場合、コマンドは履歴リストに保存されません。 0より小さい値を使用すると、各コマンドは履歴リストに制限なく保存されます。シェルは起動ファイルを読み込んだ後、デフォルト値を 500 に設定します。

履歴ファイルサイズ 履歴ファイルに含まれる最大行数。この変数に値が割り当てられると、必要に応じて最も古いエントリが削除され、その行数だけが含まれるように履歴ファイルが切り捨てられます。シェルが終了すると、履歴ファイルも作成され、このサイズに切り捨てられます。値が0の場合、履歴ファイルは0サイズに切り捨てられます。数値以外の値とゼロより小さい数値は切り捨てが禁止されます。シェルは起動ファイルを読み込んだ後、デフォルト値を HISTSIZE 値に設定します。

.bashrcたとえば、私のファイルには次の設定があります。

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
HISTSIZE=1000
HISTFILESIZE=2000

答え3

シェル変数がまたはHISTCONTROLに設定されていないことを確認してください。ignorespaceignoreboth

$ echo $HISTCONTROL
ignoredups  #this is ok

~/.bash_profileあなたまたはあなたのファイル~/.profileに値を設定して修正することができます。

HISTCONTROL=ignoredups

bashマニュアルページから:

組織管理

コマンドが履歴リストに保存される方法を制御するコロンで区切られた値のリスト。

値リストにが含まれている場合、ignorespace空白文字で始まる行は履歴リストに保存されません。

値を指定するignoredupsと、以前の履歴エントリと一致する行は保存されません。

の値はandの略語ignorebothです。ignorespaceignoredups

値をerasedups指定すると、行を保存する前に、現在の行に一致するすべての前の行が履歴リストから削除されます。

上記のリストにない値は無視されます。

設定されていない場合、または有効な値が含まれていない場合、HISTCONTROL シェルパーサーによって読み取られたすべての行は値に従って履歴リストに保存されますHISTIGNORE。複数行の複合コマンドの2行目以降の行はテストされず、値に関係なく履歴に追加されますHISTCONTROL

答え4

OPと同様に、複数の端末と終了する可能性のある「ランダムな順序」によって記録が失われることは迷惑です。ある端末から別の端末に履歴を転送できるようにしたいが、必要な場合にのみ継続的に実行したり、シェルが終了したときに保存して他の端末とマージしたりすることはありません。

結果はこんな感じです...

ディスクの「.bash_history」をメモリのシェル「history」とマージします。タイムスタンプの順序とそのタイムスタンプ内のコマンドの順序は保持されます。

定義されたPerl REに従って、一意のコマンド(複数行を含む)を削除するか、単純で敏感なコマンドを削除(消去)するオプションがあります。合わせて調整してください!

https://antofthy.gitlab.io/software/history_merge.bash.txt

「.bash_logout」からスクリプトをインポートするためにエイリアス「hc」を使用しますが、履歴保存をオフにしない場合にのみ($ HISTFILEの設定を解除 - 場合によっては「プライベート」シェルセッション)。

楽しんでください。

関連情報