1. ホーム
  2. バッシュ

[解決済み】bash HISTSIZE vs. HISTFILESIZE?

2022-04-09 18:44:17

質問

の違いは何ですか? HISTSIZE vs. HISTFILESIZE ?

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

なぜこの2つが必要なのか、ここや他のフォーラムでは明確になっていないようです。( 例1 , 例2 , 例3 ).

どのように解決するのですか?

簡単にお答えします。

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

HISTFILESIZE は、(a) セッションの起動時に履歴ファイルへの保存が許可され、(b) bash セッションの終了時に将来のセッションで使用するために履歴ファイルに保存される行またはコマンドの数を指定します。

の区別に注意してください。 file とは異なり、ディスク上の list : メモリー内

長い回答です。

上記のすべての情報+いくつかの例。

例1 : HISTFILESIZE=10HISTSIZE=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からやり直しになります。

例2 : HISTFILESIZE=10HISTSIZE=5

  1. セッションを開始します。
  2. HISTFILE (bashコマンドの履歴を保存するファイル) は、最大でHISTFILESIZE=10行に切り詰められる。
  3. 50行書きました。
  4. 50個のコマンドが終了した時点で、46から50のコマンドだけが、HISTSIZE=5で決定されるサイズの履歴リストに残っています。
  5. セッションを終了します。
  6. 想定されること histappend が有効でない場合、コマンド46から50がHISTFILEに保存され、最初に持っていた10個のコマンドと新しく書き込まれた5個のコマンドが保存されます。
  7. HISTFILEは、HISTFILESIZE=10行に切り詰められます。
  8. 現在、履歴には10個のコマンドがあります。以前のセッションで入力した5個と、終了したばかりのセッションで入力した最後の5個です。
  9. 新しいセッションを開始すると、HISTFILEがHISTFILESIZE=10で1からやり直しになります。

例3 : HISTFILESIZE=5HISTSIZE=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. 新しいセッションを開始するときは、HISTFILEをHISTFILESIZE=5にして、ステップ1からやり直します。

情報元 エリクサーシナリ :

コマンドを入力しても、履歴ファイル("file")は更新されません。コマンドを入力しても更新されません。 コマンドは、別途 "list" に保存されます(history でアクセス可能)。 コマンドを使用します)。この保存されるコマンドの数は HISTSIZE値。シェル(対話型)が終了するとき、最後の その "list" から $HISTSIZE 行が $HISTFILE にコピー/追加されます。 HISTFILESIZEが設定されている場合、この操作の後、以下のことが保証されます。 HISTFILE に存在するのは $HISTFILESIZE 行(最新)だけであること。また シェルを起動すると、リストが$HISTFILEから$quot;list"まで初期化されます。 コマンドの最大数です。

そして、その中から man bash のページをご覧ください。

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

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