214

HISTSIZE与有什么区别HISTFILESIZE

它们用于将 bash 历史记录扩展到默认的 500 行之外。

这里和其他论坛似乎都不清楚为什么需要它们。(例 1例 2例 3)。

4

2 回答 2

350

简短的回答:

HISTSIZE是 bash 会话正在进行时存储在历史列表中的内存中的行数或命令数。

HISTFILESIZE是(a)在会话启动时允许在历史文件中的行数或命令数,以及(b)在 bash 会话结束时存储在历史文件中以供将来的会话使用。

file注意: on disk - 和list: in memory之间的区别。

长答案:

以上所有信息+一些示例:

示例 1HISTFILESIZE=10HISTSIZE=10

  1. 你开始你的会话。
  2. 您的 HISTFILE(存储 bash 命令历史记录的文件)被截断为包含 HISTFILESIZE=10 行。
  3. 你写了 50 行。
  4. 在您的 50 个命令结束时,只有命令 41 到 50 在您的历史列表中,其大小由 HISTSIZE=10 确定。
  5. 你结束你的会话。
  6. 假设histappend未启用,命令 41 到 50 将保存到您的 HISTFILE 中,该文件现在包含它在开始时保存的 10 个命令以及 10 个新写入的命令。
  7. 您的 HISTFILE 被截断以包含 HISTFILESIZE=10 行。
  8. 您的历史记录中现在有 10 个命令 - 您刚刚在刚刚完成的会话中键入的最后 10 个命令。
  9. 当您开始一个新会话时,您从 1 开始,其 HISTFILESIZE=10。

示例 2HISTFILESIZE=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. 当您开始一个新会话时,您从 1 开始,其 HISTFILESIZE=10。

示例 3HISTFILESIZE=5HISTSIZE=10

  1. 你开始你的会话。
  2. 您的 HISTFILE(存储 bash 命令历史记录的文件)被截断为最多包含 HISTFILESIZE=5 行。
  3. 你写了 50 行。
  4. 在您的 50 个命令结束时,只有命令 41 到 50 在您的历史列表中,其大小由 HISTSIZE=10 确定。
  5. 你结束你的会话。
  6. 假设histappend未启用,命令 41 到 50 将保存到您的 HISTFILE 中,该文件现在具有它在开始时保存的 5 个命令以及 10 个新写入的命令。
  7. 您的 HISTFILE 被截断以包含 HISTFILESIZE=5 行。
  8. 现在,您的历史记录中有 5 个命令 - 您刚刚在刚刚完成的会话中键入的最后 5 个命令。
  9. 当您开始一个新会话时,您会从第 1 步重新开始,并使用 HISTFILESIZE=5 的 HISTFILE。

来自elixir_sinari的信息:

键入命令时,历史“文件”不会更新。这些命令分别存储在一个“列表”中(由历史命令访问)。这些存储命令的数量由 HISTSIZE 值控制。当 shell(交互式)退出时,最后的 $HISTSIZE 行从该“列表”复制/附加到 $HISTFILE。如果设置了 HISTFILESIZE,则在此操作之后,确保 $HISTFILE 中仅存在 $HISTFILESIZE 行(最新)。当 shell 启动时,“列表”从 $HISTFILE 初始化到最多 $HISTSIZE 命令。

并从man bash页面:

HISTSIZE 变量的值用作要保存在历史列表中的命令数。最后一个 HISTSIZE 命令的文本(默认 500)被保存。(...)

启动时,历史从由变量 HISTFILE 命名的文件初始化(默认为 ~/.bash_history)。如有必要,由 HISTFILE 值命名的文件将被截断,以包含不超过 HISTFILESIZE 值指定的行数。(...) 当一个交互式 shell 退出时,最后的 $HISTSIZE 行从历史列表复制到 $HISTFILE。如果启用了 histappend shell 选项(请参见下面 SHELL BUILTIN COMMANDS 下的 shopt 描述),则将这些行附加到历史文件中,否则将覆盖历史文件。如果 HISTFILE 未设置,或者历史文件不可写,则不保存历史记录。(...) 保存历史记录后,历史记录文件被截断为不超过 HISTFILESIZE 行。如果未设置 HISTFILESIZE,

于 2013-10-18T16:43:37.317 回答
7

建立在 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

我们可以清楚地看到我们的第一个命令(“ABC”)不在历史记录中,因为只记录了最后 5 个命令。

现在,全部历史记录存储在一个文件 ( .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
于 2016-10-12T09:57:20.293 回答