bash HISTSIZE vs. HISTFILESIZE?

art*_*omp 142 unix bash

HISTSIZEHISTFILESIZE?有什么区别?

它们用于将bash历史扩展到超过默认的500行.

这里似乎缺乏明确性,而在其他论坛中似乎并不清楚它们为什么都需要.(实施例1,实施例2,实施例3).

art*_*omp 249

简短回答:

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

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

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

答案很长:

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

filelist

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

HISTSIZE=10histappend

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

HISTSIZE=5histappend

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

来自elixir_sinari的信息:

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

并从HISTSIZE=10页面:

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

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

  • +1这个答案令人印象深刻!我觉得有点太多了.大多数人都无法达到目的.我认为你应该考虑总结一下 (24认同)
  • @slezica我不同意你的评论的第二部分:我到了最后,我可以说答案中的每一点信息都是有用的.有些人懒得读几行不应该为其他人删除有用的信息. (16认同)
  • 你看,我的硬盘为1TB,基本上空了,我有空闲的CPU周期和RAM的采空区,我想尽可能多的bash的历史记录保存在合理的可能 - 所以当我需要仰视那个愚蠢的命令我避风港"两年后,我知道这是我的bash历史.为了使它更具体,让我们说最多50 MB的bash历史.你推荐什么价值观? (5认同)
  • @Matthew对不起,不知道! (2认同)
  • *HISTFILESIZE=10 和 HISTSIZE=10* – 当您尝试显示两个不同变量之间的差异时,为两个不同的变量选择“相同的值”并没有真正的帮助。考虑到答案后面有 10, 5 和 5, 10 个案例,这一个 - 10, 10 - 应该删除。 (2认同)

Pit*_*kos 7

建立在 arturomp 所说的基础上,并努力使其更加清晰。

假设你有 2000 年的悠久历史..

~$ history
    1  sdf
    2  fghdfgjf
    3  fghfghdf
   ..  ..
 2027  78
 2028  57
 2029  yu45u
Run Code Online (Sandbox Code Playgroud)

您可以减少显示的内容 HISTSIZE

~$ HISTSIZE=5
~$ history
 2026  546
 2027  78
 2028  56
 2029  yu45u
 2030  HISTSIZE=5
Run Code Online (Sandbox Code Playgroud)

现在,无论您键入多少命令,都只会记录最后 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
Run Code Online (Sandbox Code Playgroud)

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

  • @CivFan:设置`HISTSIZE=-1` 和`HISTFILESIZE=-1`。 (10认同)
  • @SebMa 我将设置更改为 `HISTSIZE='INFINITY'` 和 `HISTFILESIZE='ANDBEYOND'`。由于它们是非数字的,因此可以保存所有内容。谢谢你的提示! (6认同)
  • 如果我希望将 *all* 并发终端的 *all* 历史记录保存到 bash 历史记录中,*永远*,你会推荐什么值?换句话说,始终保存所有内容,永远不要删除任何内容。 (4认同)
  • @BrendanByrd `bash` 手册页说:`非数字值和小于零的数字值禁止截断`但后来我没有勇气检查这是否属实,因为我不想失去我的历史: -) (4认同)
  • 这是大错特错。将其设置为 -1 将清除所有内容。 (2认同)