无限的Bash历史

Fra*_*art 314 unix bash

我希望我的.bash_history文件无限制.例如,我总是可以回去看看我是如何构建/配置某些东西,或者那个漂亮的命令是什么,或者几周之前某些命令是如何破坏的.如何更改此设置?

fot*_*kis 396

经过多年来的许多大型,丑陋的迭代和奇怪的边缘情况,我现在有一个专门用于此的.bashrc的简洁部分.

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

# for setting history length see HISTSIZE and HISTFILESIZE in bash(1)
# HISTSIZE=1000
# HISTFILESIZE=2000
Run Code Online (Sandbox Code Playgroud)

其次,将其添加到.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"
Run Code Online (Sandbox Code Playgroud)

注意:每个命令在运行后立即写入,因此如果您不小心粘贴了密码,您不能只是"杀死-9 %%"以避免历史记录写入,您需要手动删除它.

另请注意,每个bash会话都会在内存中加载完整的历史记录文件,但即使您的历史文件增长到10MB(这需要很长很长时间),您也不会注意到对bash启动时间有太大影响.

  • 在我的标准bash系统中添加它,添加当前历史也很好,所以在配置之后,运行`cat~/.bash_history >>〜/ .bash_eternal_history` (7认同)
  • Bash 在启动期间截断历史文件,因此您“必须”注释掉 .bashrc 中的默认设置。仅仅覆盖您自己的自定义 rc 文件中的设置只会让您陷入令人沮丧的情况,bash 看起来不尊重您对历史存储配置的更改。 (3认同)
  • 在`.bashrc`的罪魁祸首,我在.bashrc加载的另一个文件后进行了设置...,现在正在工作!谢谢! (2认同)
  • 要保留历史历史,请使用您当前的历史初始化历史文件。 (2认同)
  • 你说“首先,你必须注释掉或删除 .bashrc 的这一部分(Ubuntu 默认)。如果你不这样做,那么某些环境(例如运行屏幕会话)仍然会截断你的历史记录:”为什么这只会影响环境像屏幕而不是其他?我正在运行 Mint 17,并且必须从 /etc/bash.bashrc 中删除这两行,否则每次我启动屏幕会话时,历史文件都会被截断为 2000 个条目。令人困惑的是,当我打开一个新终端时, /etc/bash.bashrc 文件也正在运行,但在这种情况下,它并没有截断历史文件...... (2认同)
  • 很好的建议。我使用 `export HISTFILE="/home/$USER/hist/\`uname -n``tty | tr '/' '-'\`"` 来将每个会话的 shell 历史记录分开(基于主机名和 tty 名称) 。当然,我必须先创建 ~/hist 目录。 (2认同)
  • 非常感谢-**设置“ HISTFILESIZE”(可能还有“ HISTSIZE”)会过分强调效果。 (2认同)
  • 为什么不需要设置`shopt -s histappend` 有没有很好的解释?也? (2认同)
  • @Muzer:这个答案可能假设默认的 .bashrc 文件已经包含 `shopt -s histappend`。至少对于 Ubuntu 18.04.1 桌面来说是这样,但在其他 Linux 安装上可能并非如此。 (2认同)

Lri*_*Lri 271

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

HISTSIZE= 
HISTFILESIZE=
Run Code Online (Sandbox Code Playgroud)

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).
Run Code Online (Sandbox Code Playgroud)

  • (导出PROMPT_COMMAND ='history -a')可以立即刷新命令以打破历史记录. (11认同)
  • @PhilippLudwig设置`HISTSIZE = -1 HISTFILESIZE = -1`禁用了我的历史记录,而`HISTSIZE = HISTFILESIZE =`做了伎俩.CentOS 7在这里. (5认同)
  • @Seether 答案明确指出“在 bash 4.3 及更高版本中......”。CentOS 7 有 bash 4.2.x。 (5认同)
  • 设置``HISTSIZE = HISTFILESIZE =``会导致完全禁用bash历史记录,至少对我而言. (3认同)
  • @PhilippLudwig 我认为你应该 `export HISTSIZE=` `export HISTFILESIZE=` 而不是 `HISTSIZE= HISTFILESIZE=` (2认同)

sim*_*ont 35

正如JörgBeyer所述,HISTSIZE并且HISTFILESIZE是关键.

此外,你一定要检查环境变量HISTCONTROL,它可以让你做一些很酷的事情,比如不存储重复的历史命令(HISTCONTROL=erasedups).如果你必须浏览数百行cd ..或类似的行,那么无限的历史就没有意义了.

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

  • 这些CD行为您提供了发出的命令的上下文.它们实际上非常有用.我无法理解为什么有人会想要删除它们,除非您使用历史记录的唯一方法是一次通过一个命令进行分页. (10认同)
  • 如果重用命令序列,保持线路顺序非常有用.例如`Ctrl-r` somechars`Ctrl-o``Ctrl-o``Ctrl-o``Ctrl-o`.这就是我在历史上保留重复的原因. (6认同)
  • @CiprianTomoiagă`Ctrl-o`在提示符下运行命令,并立即显示历史记录中前一个命令.一个好处是,在使用`Ctrl-r`查找旧命令(可能使用向上和向下箭头移动到历史中的相邻命令)后,按住"Ctrl"并按"o"多次运行就足够了再次上一系列命令,即使在你想要的无限循环中也是如此.另见[GNU Readline - Wikipedia](https://en.wikipedia.org/wiki/GNU_Readline"GNU Readline - Wikipedia") (4认同)
  • @StéphaneGourichon 什么是`Ctrl-o`? (2认同)

Jör*_*yer 22

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

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

我认为我们可以同意无限期这个词通常与非常大(或者你有无限的文件存储?).所以只需设置非常大的值.

  • "应该注意的是,对于非常小的无穷大值,1000000000只等于无穷大. - sepp2k"lol.是的,我满足于无穷大的小值(比如一个月经常使用终端). (22认同)
  • 一个月的频繁终端使用是无穷大的一小部分.我会说,频繁使用终端的一生等同于***非常非常小的无穷大值.但终身使用频繁的终端使用对我的shell历史来说已经足够了.;) (5认同)
  • 如果将HISTSIZE和/或HISTFILESIZE设置得太大,则至少较旧的zsh版本会崩溃,因为它会尝试预分配足够的内存。这在运行使用zsh作为其外壳程序的工具(例如dbx)时变得很重要。 (2认同)