【问题标题】:Unlimited Bash History [closed]无限的 Bash 历史[关闭]
【发布时间】:2012-02-26 21:15:35
【问题描述】:

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

【问题讨论】:

标签: bash unix


【解决方案1】:

多年来经历了许多大而丑陋的迭代和奇怪的边缘情况,我现在有一个简洁的my .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 启动时间有影响。

【讨论】:

  • .bashrc 的罪魁祸首,我在 .bashrc 加载的另一个文件之后进行了该设置...,现在可以工作了!谢谢!
  • 添加到我的标准bash系统中,添加当前历史也不错,所以配置后运行cat ~/.bash_history >>~/.bash_eternal_history
  • 要保留历史历史,请用您当前的历史初始化历史文件。
  • 您说“首先,您必须注释掉或删除 .bashrc 的这一部分(Ubuntu 的默认设置)。如果您不这样做,那么某些环境(例如运行屏幕会话)仍会截断您的历史:“为什么这只影响像屏幕这样的环境而不影响其他环境?我正在运行 Mint 17,并且必须从 /etc/bash.bashrc 中删除这两行,否则每次我启动屏幕会话时,历史文件都会被截断为 2000 个条目。令人困惑的是,当我打开一个新终端时,/etc/bash.bashrc 文件也在运行,但在那种情况下,它并没有截断历史文件......
  • 非常感谢 - 设置HISTFILESIZE(可能还有HISTSIZE)将立即产生效果不能强调 /b>.
【解决方案2】:

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

HISTSIZE= 
HISTFILESIZE=

bash 4.3 and later你也可以使用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).

bash --version 检查您的 bash 版本。

【讨论】:

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

因为 Jörg Beyer mentioned in his answerHISTSIZEHISTFILESIZE 是关键。

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

链接:hereworking with bash history。 bash 变量常见问题解答也是worth browsing

【讨论】:

  • 这些 cd 行为您提供了发出命令的上下文。它们实际上非常有用。我不明白为什么有人会想要删除它们,除非你使用历史的唯一方法是一次翻阅一个命令。
  • @simont 我还将 ignorespace 选项与 HISTCONTROL 一起使用,然后将其用于我不想写入历史记录的任何内容,例如密码。
  • 如果您重复使用命令序列,则保持行的顺序非常有用。例如。 Ctrl-r somechars Ctrl-o Ctrl-o Ctrl-o Ctrl-o。这就是我在历史中保留重复的原因。
  • @StéphaneGourichon Ctrl-o 是什么?
  • @CiprianTomoiagă Ctrl-o 在提示符下运行命令,并在历史记录中的前一个命令之后立即显示该命令。一个好处是,在使用Ctrl-r 找到一个旧命令后(可能使用上下箭头移动到历史上的相邻命令),按住Ctrl 并多次按o 即可再次运行之前的一系列命令,如果你愿意的话,即使在无限循环中。另见GNU Readline - Wikipedia
【解决方案4】:

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

  • HISTSIZE:存储在内存中的条目数
  • HISTFILESIZE:存储在历史文件中的行数

**详情为here

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

【讨论】:

  • "应该注意的是,1000000000 仅对于非常小的无穷大值等于无穷大。- sepp2k" 哈哈。是的,我满足于小的无穷大值(比如,频繁使用终端一个月)。
  • 一个月频繁使用终端只是无穷大的一小部分。我会说终生频繁使用终端等同于 非常非常非常 很小的无穷大值。但是一生频繁使用终端对于我的 shell 历史来说已经足够了。 ;)
  • 如果您将 HISTSIZE 和/或 HISTFILESIZE 设置得太大,旧版本的 zsh 至少会崩溃,因为它会尝试预先分配足够的内存。这在运行使用 zsh 作为 shell 的工具(例如 dbx)时变得相关。
  • 无限有不同的类型:参见可数无限和不可数无限。询问的人可能会感兴趣.. 我相当肯定有很多人在 stackoverflow 周围闲逛。
猜你喜欢
  • 2011-10-29
  • 2013-01-08
  • 2015-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2015-05-05
相关资源
最近更新 更多