bash HISTSIZE対HISTFILESIZE?


174

HISTSIZEvs. はどう違いHISTFILESIZEますか?

これらは、デフォルトの500行を超えてbash履歴を拡張するために使用されます。

ここと他のフォーラムでは、なぜ両方が必要なのかについて明確さが欠けているようです。(例1例2例3)。

回答:


289

短い答え:

HISTSIZE bashセッションの進行中に履歴リストのメモリに保存される行またはコマンドの数です。

HISTFILESIZE は、(a)セッションの起動時に履歴ファイルで許可される行数またはコマンド数であり、(b)今後のセッションで使用するためにbashセッションの終了時に履歴ファイルに保存されます。

file:ディスク上-とlist:メモリ内の違いに注意してください。

長い答え:

上記のすべての情報といくつかの例:

例1HISTFILESIZE=10およびHISTSIZE=10

  1. セッションを開始します。
  2. HISTFILE(bashコマンド履歴を格納するファイル)は、HISTFILESIZE = 10行を含むように切り捨てられます。
  3. あなたは50行を書きます。
  4. 50個のコマンドの最後では、コマンド41〜50のみが履歴リストにあり、そのサイズはHISTSIZE = 10によって決定されます。
  5. セッションを終了します。
  6. histappend無効になっていると仮定すると、コマンド41〜50がHISTFILEに保存されます。HISTFILEには、最初に保持された10個のコマンドと10個の新しく書き込まれたコマンドが含まれています。
  7. HISTFILEは、HISTFILESIZE = 10行を含むように切り捨てられます。
  8. これで、履歴に10個のコマンドがあります。最後に終了したセッションで入力した最後の10個です。
  9. 新しいセッションを開始すると、HISTFILEがHISTFILESIZE = 10の1から始めます。

例2HISTFILESIZE=10HISTSIZE=5

  1. セッションを開始します。
  2. HISTFILE(bashコマンド履歴を格納するファイル)は、最大でHISTFILESIZE = 10行を含むように切り捨てられます。
  3. あなたは50行を書きます。
  4. 50個のコマンドの最後では、46〜50個のコマンドのみが履歴リストにあり、そのサイズはHISTSIZE = 5によって決定されます。
  5. セッションを終了します。
  6. histappend無効になっていると仮定すると、コマンド46〜50がHISTFILEに保存されます。HISTFILEには、最初に保持されていた10個のコマンドと5個の新しく書き込まれたコマンドが含まれています。
  7. HISTFILEは、HISTFILESIZE = 10行を含むように切り捨てられます。
  8. これで、履歴に10個のコマンドがあります。前のセッションからの5つのコマンドと、終了したセッションで入力した最後の5つです。
  9. 新しいセッションを開始すると、HISTFILEがHISTFILESIZE = 10の1から始めます。

例3HISTFILESIZE=5およびHISTSIZE=10

  1. セッションを開始します。
  2. HISTFILE(bashコマンド履歴を格納するファイル)は、最大でHISTFILESIZE = 5行を含むように切り捨てられます。
  3. あなたは50行を書きます。
  4. 50個のコマンドの最後では、コマンド41〜50のみが履歴リストにあり、そのサイズはHISTSIZE = 10によって決定されます。
  5. セッションを終了します。
  6. histappend無効になっていると仮定すると、コマンド41〜50がHISTFILEに保存されます。HISTFILEには、最初に保持されていた5つのコマンドと10個の新しく書き込まれたコマンドがあります。
  7. HISTFILEは、HISTFILESIZE = 5行を含むように切り捨てられます。
  8. これで、履歴に5つのコマンドがあります-終了したばかりのセッションで入力した最後の5つ。
  9. 新しいセッションを開始すると、HISTFILESIZE = 5のHISTFILEでステップ1からやり直します。

elixir_sinariからの情報:

コマンドを入力しても、履歴「ファイル」は更新されません。コマンドは個別に「リスト」に保管されます(historyコマンドによってアクセスされます)。これらの保存されたコマンドの数は、HISTSIZE値によって制御されます。シェル(対話式)が終了すると、最後の$ HISTSIZE行がその「リスト」から$ HISTFILEにコピー/追加されます。HISTFILESIZEが設定されている場合、この操作の後、$ HISTFILESIZE行(最新)のみが$ HISTFILEに存在することが保証されます。シェルが開始すると、「リスト」は$ HISTFILEから最大$ HISTSIZEコマンドまで初期化されます。

そしてman bashページから:

HISTSIZE変数の値は、履歴リストに保存するコマンドの数として使用されます。最後のHISTSIZEコマンドのテキスト(デフォルトは500)が保存されます。(...)

起動時に、履歴は変数HISTFILE(デフォルト〜/ .bash_history)で指定されたファイルから初期化されます。HISTFILEの値で指定されたファイルは、HISTFILESIZEの値で指定された行数以下になるように、必要に応じて切り捨てられます。(...)対話型シェルが終了すると、最後の$ HISTSIZE行が履歴リストから$ HISTFILEにコピーされます。histappendシェルオプションが有効になっている場合(下記のシェル構築コマンドの下のshoptの説明を参照)、行が履歴ファイルに追加されます。そうでない場合、履歴ファイルは上書きされます。HISTFILEが設定されていない場合、または履歴ファイルが書き込み不可の場合、履歴は保存されません。(...)履歴を保存した後、履歴ファイルはHISTFILESIZE行以下になるように切り捨てられます。HISTFILESIZEが設定されていない場合、


27
+1この答えは印象的に完全です!少し多すぎると思います。ほとんどの人はそれの終わりに到達しません。私はあなたがそれを要約することを検討すべきだと思います
slezica '07年

22
@slezicaコメントの2番目の部分に同意しません。コメントの最後に達しました。回答のすべての情報は役に立ちます。一部の人が数行を読むのが面倒なので、他の人のために有用な情報を削除することを正当化すべきではありません。
バスティアン2016年

1
@Bastienは、あなたが箇条書きのパーサーであると想定して、これを読むのに何の問題もありません。
ピティコス2016年

6
見てください、私のハードドライブは1 TBでほとんど空で、アイドル状態のCPUサイクルとRAMの塊があり、可能な限り多くのbash履歴を保存したいので、その愚かなコマンドを調べる必要があるときは、 2年で実行される、それは私のbashの歴史にあることを知っています。より具体的にするために、最大50 MBのbash履歴があるとします。どのような値をお勧めしますか?
CivFan 2016年

2
@マシュー申し訳ありませんが、それを知りません!
arturomp 2017年

6

arturompの発言に基づいて構築し、少し明確にするために努力しています。

あなたは2000年の長い歴史があると仮定します。

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u

表示されているものを削減できます HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5

これで、コマンドをいくつ入力しても、最後の5つだけが記録されます。

~$ ABC
~$ GGH
~$ GSDHFG
~$ JFDR
~$ ABSDDS
~$ AHFGHFD
<close terminal>
<open new terminal>
~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
 2031  GGH
 2032  GSDHFG
 2033  JFDR
 2034  ABSDDS
 2035  AHFGHFD

最後の5つのコマンドのみが記録されているため、最初のコマンド( "ABC")が履歴にないことがはっきりとわかります。

これで、全履歴がファイル(.bash_history)に保存され、このファイルがで取得する時間を変更できますHISTFILESIZE。たとえば2033 HISTFILESIZE、の場合、私の場合は次のようになります。

~$ history
    1  fghfghdf
    2  gegege
    3  gege
   ..  ..
 2028  HISTSIZE=5
 2029  GGH
 2030  GSDHFG
 2031  JFDR
 2032  ABSDDS
 2033  AHFGHFD

3
私がしたい場合、あなたはどのような値をお勧めしますすべての歴史のすべての同時端子は、bashの履歴に保存されるように永遠に?言い換えれば、常にすべてを保存し、何も削除しないでください。
CivFan 2016年

10
@CivFan:とを設定HISTSIZE=-1HISTFILESIZE=-1ます。
M.ダドリー

2
これは間違いです。-1に設定すると、すべてがクリアされます。
ブレンダンバード2018

3
@BrendanByrd bash:manページは言う Non-numeric values and numeric values less than zero inhibit truncationが、これが本当であるならば、私は私の歴史を失いたくないので、私はチェックする勇気を持っていなかった:-)
SebMa

3
@SebMa設定をHISTSIZE='INFINITY'およびに変更しましたHISTFILESIZE='ANDBEYOND'。それらは非数値なので、すべてを保存します。先端をありがとう!
Connor
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.