无限重击历史[关闭]


350

我希望我的.bash_history文件不受限制。例如,所以我总是可以回头看看我是如何构建/配置某些东西的,或者那个漂亮的命令是什么,或者某条命令在几周前是如何中断的。如何更改此设置?



1
Bash是一种编程语言,这与编程无关吗?
NeilG

Answers:


307

设置HISTSIZEHISTFILESIZE在.bashrc中为空字符串:

HISTSIZE= 
HISTFILESIZE=

bash 4.3及更高版本中,您还可以使用HISTSIZE=-1 HISTFILESIZE=-1

n.  Setting HISTSIZE to a value less than zero causes the history list to be
    unlimited (setting it 0 zero disables the history list).

o.  Setting HISTFILESIZE to a value less than zero causes the history file size
    to be unlimited (setting it to 0 causes the history file to be truncated
    to zero size).

12
(export PROMPT_COMMAND ='history -a')可以立即刷新命令以刷新历史记录。
cruelcage 2014年

3
设置HISTSIZE= HISTFILESIZE=结果会完全禁用bash历史记录,至少对我而言。
菲利普·路德维希

5
@PhilippLudwig设置HISTSIZE=-1 HISTFILESIZE=-1禁用了我的历史记录,但HISTSIZE= HISTFILESIZE=做到了。这里的CentOS 7。
Seether

1
@PhilippLudwig我想而不是HISTSIZE= HISTFILESIZE=你应该export HISTSIZE= export HISTFILESIZE=
-Matzz

3
@Seether答案明确指出“在bash 4.3及更高版本中...”。CentOS 7具有bash4.2.x。
villapx '19

426

多年来,经过了许多大的,丑陋的迭代和怪异的边缘案例之后,我现在在.bashrc的简明部分中专门讨论了这一点。

首先,您必须注释掉或删除.bashrc的这一部分(Ubuntu的默认设置)。如果您不这样做,那么某些环境(例如正在运行的screen会话)仍会截断您的历史记录:

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000

其次,将其添加到.bashrc的底部:

# Eternal bash history.
# ---------------------
# Undocumented feature which sets the size to "unlimited".
# http://stackoverflow.com/questions/9457233/unlimited-bash-history
export HISTFILESIZE=
export HISTSIZE=
export HISTTIMEFORMAT="[%F %T] "
# Change the file location because certain bash sessions truncate .bash_history file upon close.
# http://superuser.com/questions/575479/bash-history-truncated-to-500-lines-on-each-login
export HISTFILE=~/.bash_eternal_history
# Force prompt to write history after every command.
# http://superuser.com/questions/20900/bash-history-loss
PROMPT_COMMAND="history -a; $PROMPT_COMMAND"

注意:每条命令在运行后都会立即写入,因此,如果您不小心粘贴了密码,就不能仅仅“ kill -9 %%”来避免写入历史记录,您需要手动将其删除。

还要注意,每个bash会话都会将完整的历史文件加载到内存中,但是即使您的历史文件增长到10MB(这将花费很长很长的时间),您也不会注意到对bash启动时间的很大影响。


1
@AquariusPower-尝试执行上述操作,使HISTFILESIZE=和为HISTSIZE=空而不是-1,并确保在.bashrc或.bash_profile或.profile中没有这些参数的其他声明。
fotinakis 2014年

2
罪魁祸首是.bashrc,我在另一个由.bashrc ...加载的文件上进行了设置,现在可以工作了!谢谢!
Aquarius Power

10
将其添加到我的标准bash系统中,并且添加当前历史记录也很好,因此在配置后运行cat ~/.bash_history >>~/.bash_eternal_history
Jean-Christophe Meil​​laud 2014年

2
要保留历史记录历史记录,请使用当前历史记录初始化历史记录文件。
亚瑟

3
非常感谢- 设置HISTFILESIZE(并可能HISTSIZE立即生效的事实不能过分强调
阿提

37

如约尔格拜尔如上所述,HISTSIZEHISTFILESIZE是关键。

此外,您绝对应该检查环境变量HISTCONTROL,它可以使您完成一些很酷的事情,例如不存储重复的历史命令(HISTCONTROL=erasedups)。如果必须浏览数百行cd ..或类似的行,没有无限的历史记录是没有意义的。

链接:在这里,并使用bash历史记录。bash Variable FAQ也值得浏览


13
cd的这些行为您提供了发出命令的上下文。实际上,它们非常有用。我不明白为什么有人会删除它们,除非您使用历史记录的唯一方法是一次翻阅一个命令。
iconoclast 2014年

@simont我还将HISTCONTROL与ignorespace选项一起使用,然后将其用于我不想写入历史的任何内容,例如密码。
bigtunacan 2015年

6
如果重用命令序列,则使行保持秩序非常有用。例如Ctrl-rsomechars Ctrl-o Ctrl-o Ctrl-o Ctrl-o。这就是为什么我在历史记录中保留重复项。
斯特凡纳·古里科

1
@StéphaneGourichon做什么用的Ctrl-o
西普里安·托莫阿格(CiprianTomoiagă)

4
@CiprianTomoiagă Ctrl-o在提示符处运行命令,并在历史记录中的前一个命令之后立即显示该命令。一个好处是,在Ctrl-r用于查找旧命令(可能使用向上和向下箭头移动到历史记录中的相邻命令)之后,只要保持Ctrl按下并o多次按下即可再次运行先前的一系列命令,即使在无限循环中也足够了如果你想。另见GNU的Readline -维基百科
斯特凡纳·古里科

22

这里(至少)有两个相关的环境变量:

  • HISTSIZE:历史文件中的条目数
  • HISTFILESIZE:历史文件中的行数

我认为我们可以同意“ 无限”一词通常与很大一样(或者您有无限的文件存储空间吗?)。因此,只需将值设置得很大即可。


23
“应该注意,对于非常小的无穷大值,1000000000只等于无穷大。– sepp2k”大声笑。是的,我对无穷小值感到满意(例如,一个月频繁使用终端)。
弗朗西斯·哈特

6
一个月频繁的终端使用是无限的一小部分。我想说的频繁使用终端的寿命等同于一个非常非常非常无穷小的值。但是终生频繁使用终端对于我的shell历史已经足够了。;)
iconoclast 2014年

2
如果将HISTSIZE和/或HISTFILESIZE设置得太大,则至少较旧的zsh版本会崩溃,因为它会尝试预分配足够的内存。这在运行使用zsh作为其外壳程序的工具(例如dbx)时变得很重要。
布赖恩·范登堡
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.