bash HISTSIZE与HISTFILESIZE?

HISTSIZEHISTFILESIZE什么HISTFILESIZE

它们用于扩展超出默认500行的bash历史logging。

这里和其他论坛似乎缺乏明确的解释,为什么他们都需要。 ( 实施例1 , 实施例2 , 实施例3 )。

简短的回答:

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

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

注意磁盘上的文件和内存中的列表之间的区别。

很长的回答:

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

HISTFILESIZE=10HISTSIZE=10

  1. 你开始你的会议。
    1. 您的HISTFILE(存储您的bash命令历史logging的文件)被截断为包含HISTFILESIZE = 10行。
  2. 你写50行。
  3. 在50条命令的结尾处,只有命令41到50位于历史列表中,其大小由HISTSIZE = 10确定。
  4. 你结束你的会议。
    1. 假设histappend没有启用,命令41到50被保存到你的HISTFILE,HISTFILE现在有10个命令在开始时加上10个新写入的命令。
    2. 您的HISTFILE被截断包含HISTFILESIZE = 10行。
  5. 现在,您的历史logging中有10条命令 – 刚刚完成的会话中最后input的10条命令。
  6. 当你开始一个新的会话时,你从1开始HISTFILESIZE = 10的HISTFILE。

HISTFILESIZE=10HISTSIZE=5

  1. 你开始你的会议。
    1. 您的HISTFILE(存储您的bash命令历史logging的文件)被截断为至多包含HISTFILESIZE = 10行。
  2. 你写50行。
  3. 在50条命令的结尾处,只有命令46到50位于历史列表中,其大小由HISTSIZE = 5确定。
  4. 你结束你的会议。
    1. 假设histappend没有被启用,命令46到50被保存到你的HISTFILE,HISTFILE现在有10个命令在开始时加上5个新写入的命令。
    2. 您的HISTFILE被截断包含HISTFILESIZE = 10行。
  5. 现在,您的历史logging中有10条命令 – 前一个会话为5个,刚完成的会话中只有最后5个。
  6. 当你开始一个新的会话时,你从1开始HISTFILESIZE = 10的HISTFILE。

HISTFILESIZE=5HISTSIZE=10

  1. 你开始你的会议。
    1. 您的HISTFILE(存储您的bash命令历史logging的文件)被截断为至多包含HISTFILESIZE = 5行。
  2. 你写50行。
  3. 在50条命令的结尾处,只有命令41到50位于历史列表中,其大小由HISTSIZE = 10确定。
  4. 你结束你的会议。
    1. 假设histappend没有启用,命令41到50被保存到你的HISTFILE,HISTFILE现在有5个命令在开始时加上10个新写入的命令。
    2. 您的HISTFILE被截断包含HISTFILESIZE = 5行。
  5. 您的历史logging中现在有5条命令 – 刚才在刚完成的会话中键入的最后5条命令。
  6. 当您开始一个新的会话时,您将从第1步开始,HISTFILESIZE = 5的HISTFILE。

来自elixir_sinari的信息:

input命令时,历史“文件”不会更新。 这些命令分别存储在“列表”中(由历史命令访问)。 这些存储的命令的数量由HISTSIZE值控制。 当shell(交互式)退出时,最后的$ HISTSIZE行被从“list”复制/追加到$ HISTFILE中。 如果HISTFILESIZE被设置,那么在这个操作之后,确保$ HISTFILE中只有$ HISTFILESIZE行(最新)。 当shell启动时,“list”从$ HISTFILE初始化为最大$ HISTSIZE命令。

并从man bash页面:

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

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

build立在arturomp所说的之上,并努力使之更清晰。

假设你有2000多年的历史..

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

你可以减less你用HISTSIZE显示的HISTSIZE

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

现在,无论您键入多less个命令,只会logging最后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”)不在历史中,因为只logging了最后的5个命令。

现在,总的历史被存储在一个文件( .bash_history )中,你可以改变这个文件用HISTFILESIZE获得的HISTFILESIZE 。 例如2033 HISTFILESIZE ,在我的情况下,我会有这样的:

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