.bash_historyファイルの内容はどのくらい持続しますか?


11

bash_historyファイルの内容を変更するにはどうすればよいですか?どの値または変数が履歴の持続期間を制御しますか?BASH履歴をより細かく制御するために変更できる他のことはありますか?



2
このファイルが時間の長さによって制御されているとは思わないが、むしろファイルの最終的なサイズ。ここを参照:bashの履歴リストのサイズを5000行以上に設定する方法はありますか?。したがって、環境。変数HISTSIZEHISTFILESIZEあり、維持する履歴の量を制御する必要がある唯一のコントロールサーフェスです。
slm

回答:


12

履歴のサイズを制御する2つの変数があります。

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

そして

HISTSIZEコマンド履歴に記憶するコマンドの数(以下の履歴を参照)。値が0の場合、コマンドは履歴リストに保存されません。ゼロより小さい数値を指定すると、すべてのコマンドが履歴リストに保存されます(制限はありません)。シェルは、起動ファイルを読み込んだ後、デフォルト値を500に設定します。

これらの2つの変数により、履歴の動作を制御できます。基本的に、HISTSIZEは現在のセッション中に保存されたコマンドの数であり、セッション間HISTFILESIZEで記憶されるコマンドの数です。したがって、たとえば:

$ echo $HISTSIZE 
10
$ echo $HISTFILESIZE 
5
$ history | wc
     10      29     173

上記の例でHISTSIZEは、historyが10に設定されているため、10個のコマンドのリストを返します。ただし、ログアウトしてから再度ログインすると、historyは5にHISTFILESIZE設定されているため、5つのコマンドのみが返されます。これは、セッションを終了するHISTFILESIZEと、履歴の行が履歴ファイルに保存されるためです(~/.bash_historyデフォルトでは、HISTFILE)。つまり、コマンドが行にHISTFILE到達するまでコマンドが追加されます。$HISTFILESIZEその時点で、追加された各行は、ファイルの最初のコマンドが削除されることを意味します。

これらの変数の値を~/.profile(または~/.bash_profileそのファイルが存在する場合)に設定できます。~/.bashrc最初にそれらを設定しないでください。ビジネスが設定されていないためです。次に、ログインシェルと非ログインシェルで異なる動作が発生し、他の問題が発生する可能性があるためです。

履歴の動作を微調整できるその他の有用な変数は次のとおりです。

  • HISTIGNORE:これにより、ほとんど関心のない特定の一般的なコマンドを無視できます。たとえば、次のように設定できます。

    export HISTIGNORE="pwd:df:du"

    これは、任意のコマンドが始まる原因となるpwddfまたはdu無視されるようにし、あなたの履歴に保存されません。

  • HISTCONTROL:これにより、履歴の動作を選択できます。個人的には、HISTCONTROL=ignoredups重複するコマンドを一度だけ保存するように設定しました。その他のオプションはignorespace、空白で始まるコマンドを無視することです。erasedupsこれにより、現在の行に一致する以前のすべての行が、その行が保存される前に履歴リストから削除されます。ignorebothignorespaceとignoreupsの省略形です。

  • HISTTIMEFORMAT:これにより、履歴ファイルの時間形式を設定できます。詳細については、Pandyaの回答man bashを参照するか、読んでください。


さらに微調整するには、次のものが必要です。

  • histappendbashのオプション。これはshopt -s histappend、コマンドを実行するか、に追加することで設定できます~/.bashrc。このオプションが設定されている場合

    履歴リストは、シェルの終了時に、ファイルを上書きするのではなく、HISTFILE変数の値で指定されたファイルに追加されます。

    これは、さまざまなセッションの履歴を組み合わせることができるため、非常に便利です(たとえば、さまざまな端末を考えてみてください)。

  • historyコマンドは2つの便利なオプションがあります。

    • history -a :最後のコマンドが履歴ファイルに自動的に書き込まれるようにします

    • history -r :履歴ファイルを現在のセッションにインポートします。

    たとえば、次の2つのコマンドをに追加できますPROMPT_COMMAND(これは、シェルがプロンプトを表示するたびに実行されるため、新しいシェルを開始するたびに、各シェルで実行した後)。

    export PROMPT_COMMAND='history -a;history -r;'

    これらを組み合わせると、新しい端末を開いたときに、他のシェルセッションの履歴がすぐにインポートされます。結果は、すべての端末/シェルセッションに共通の履歴です。


2

履歴ファイルのデフォルトのサイズは500行です。.bash_historyファイルが500行に達すると、FIFOのように、新しいエントリのためのスペースを空けるために、初期のエントリが削除されます。HISTFILESIZEこれは、デフォルトで値が500 である変数の値を変更することで変更できます。

HISTFILESIZE=10000.bashrcにa を入れると、履歴ファイルが保持できる行数が10000に増え、その内容の寿命が長くなります。


2
注:HISTSIZEの上限を引き上げる場合は、変更HISTFILEも検討してください。実行bash --norc HISTSIZEするとデフォルト値に戻り、終了時に切り捨てられますHISTFILE
llua 2014年

ありがとう、@ llua。同様に、システム/etc/bash.bashrcがaを設定している場合HISTFILESIZE(または多分HISTSIZE;私はどちらをチェックしていないか)、Bashは.bash_historyそれが読み取った時点/etc/bash.bashrc(または少なくとも、独自のBash initファイルに新しい制限が設定される前の時点)で切り捨てられているように見えます。これを回避HISTFILEするには、実際の履歴が.bash_historyBashで切り捨てられているファイルではなく、そこに移動するように独自に設定します。
Chris Povirk 2017年

(しかし、そうしないexportと、子シェルから見えるようになり、代わりに切り捨てられる可能性があるため.bash_historyです!)
Chris Povirk

0

以下のようなbashの履歴man bashについて詳しく説明します。

ヒストコントロール
       履歴リストにコマンドを保存する方法を制御する、コロンで区切られた値のリスト。
       値のリストにignorespaceが含まれている場合、スペース文字で始まる行は
       履歴リストには保存されません。ignoreupsの値は、前の行と一致する行を引き起こします
       保存しない履歴エントリ。ignorebothの値は、ignorespaceおよび
       無視された。erasedupsの値により、現在の行に一致する以前のすべての行が
       その行が保存される前に履歴リストから削除されます。上記にない値
       リストは無視されます。HISTCONTROLが設定されていない場合、または有効な値が含まれていない場合、すべての行
       シェルパーサーによって読み取られた値は、HISTIG-の値に従って履歴リストに保存されます。
       NORE。複数行の複合コマンドの2行目以降はテストされません。
       HISTCONTROLの値に関係なく、履歴に追加されます。
履歴ファイル
       コマンド履歴が保存されるファイルの名前(以下の履歴を参照)。デフォルト
       値は〜/ .bash_historyです。設定されていない場合、シェルの終了時にコマンド履歴は保存されません。
HISTFILESIZE
       履歴ファイルに含まれる最大行数。この変数が割り当てられたとき
       値。履歴ファイルは、必要に応じて、その数以下になるように切り捨てられます
       最も古いエントリを削除することで行の数を増やします。履歴ファイルもこのサイズに切り捨てられます
       シェルが終了したときにそれを書き込んだ後。値が0の場合、履歴ファイルは以下に切り捨てられます
       サイズゼロ。非数値およびゼロ未満の数値は切り捨てを禁止します。の
       シェルは、起動ファイルを読み込んだ後、デフォルト値をHISTSIZEの値に設定します。
HISTIGNORE
       保存するコマンドラインを決定するために使用されるパターンのコロンで区切られたリスト
       履歴リスト。各パターンは行の先頭に固定され、一致する必要があります
       完全な行(暗黙の「*」は追加されません)。各パターンはラインに対してテストされます
       HISTCONTROLによって指定されたチェックが適用された後。通常のシェルに加えて
       パターンマッチング文字、 `& 'は前の履歴行と一致します。`& 'はエスケープできます
       バックスラッシュを使用します。マッチを試みる前にバックスラッシュが削除されます。2番目と
       複数行の複合コマンドの後続の行はテストされず、
       HISTIGNOREの値に関係なく履歴。
ヒストサイズ
       コマンド履歴に記憶するコマンドの数(以下の履歴を参照)。もし
       値が0の場合、コマンドは履歴リストに保存されません。ゼロ未満の数値
       すべてのコマンドが履歴リストに保存されます(制限はありません)。シェル
       起動ファイルを読み込んだ後、デフォルト値を500に設定します。
HISTTIMEFORMAT
       この変数が設定されていてnullでない場合、その値はstrftime(3)のフォーマット文字列として使用されます
       履歴によって表示される各履歴エントリに関連付けられたタイムスタンプを印刷する
       ビルトイン。この変数が設定されている場合、タイムスタンプは履歴ファイルに書き込まれるため、
       シェルセッション全体で保持されます。これは、履歴コメント文字を使用して区別します
       他の履歴行からのタイムスタンプを調整します。

特に、HISTFILESIZEそしてHISTSIZEあなたが探して、あなたを助けていることがあります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.