bash HISTSIZE与HISTFILESIZE?


174

HISTSIZEvs.有HISTFILESIZE什么区别?

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

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

Answers:


289

简短答案:

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

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

注意file磁盘上的:和list内存中的:之间的区别。

长答案:

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

示例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. 当您开始新的会话时,您将从HISTFILESIZE = 10的HISTFILE重新开始。

示例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. 当您开始新的会话时,您将从HISTFILESIZE = 10的HISTFILE重新开始。

示例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. 当您开始一个新会话时,您将以HISTFILESIZE = 5的HISTFILE从步骤1重新开始。

来自elixir_sinari的信息:

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

man bash页面上:

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

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


27
+1这个答案非常彻底!我想不过太多了。大多数人都无法达到目的。我认为您应该考虑对其进行总结
slezica 2014年

22
@slezica我不同意您评论的第二部分:我到达了结尾,我可以说答案中的每一点信息都是有用的。有些人懒于阅读几行的事实不应该为其他人删除有用的信息。
巴斯蒂安

1
@Bastien假设您是项目符号分析器,那么阅读此书将毫无困难。
皮蒂科斯

6
瞧,我的硬盘驱动器是1 TB,基本上是空的,我有空闲的CPU周期和RAM,而且我想尽可能多地保存bash历史记录-所以当我需要查找那个愚蠢的命令时,跑了两年,我知道这是我的重击历史。为了更加具体,我们假设最多有50 MB的bash历史记录。您推荐什么值?
CivFan

2
@Matthew抱歉,不知道!
arturomp

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

我们可以清楚地看到我们的第一个命令(“ 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

3
如果我希望所有并发终端的所有历史记录永久保存到bash历史记录中,您会建议什么值?换句话说,始终保存所有内容,永不删除任何内容。
CivFan

10
@CivFan:设置HISTSIZE=-1HISTFILESIZE=-1
M. Dudley

2
这是完全错误的。将其设置为-1将清除所有内容。
布伦丹·伯德

3
@BrendanByrd bash手册页说: Non-numeric values and numeric values less than zero inhibit truncation但是然后我没有勇气检查这是否正确,因为我不想失去我的历史:-)
SebMa

3
@SebMa我将设置更改为HISTSIZE='INFINITY'HISTFILESIZE='ANDBEYOND'。由于它们是非数字的,因此可以保存所有内容。谢谢你的提示!
康纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.