如何:无限的Bash / shell历史记录?


Answers:


82

将此添加到您的.bashrc(Linux)或.bash_profile(MacOS):

export HISTFILESIZE=
export HISTSIZE=

您去了,无限的历史。目前我有27000个条目:)

来自man bash

如果HISTFILESIZE未设置,则不执行截断。

这意味着.bash_history永远不会被截断

同样,这似乎也适用于HISTSIZE,尽管我找不到该文件。

我要尝试的另一个简洁功能是:

如果HISTTIMEFORMAT设置了变量,则将时间戳记写入历史记录文件,并用历史记录注释字符标记,因此可以在shell会话中保留它们,如下所示:

export HISTTIMEFORMAT="%F %T "

让我知道您是否已经尝试过...


3
这实际上在许多情况下不起作用,并且bash历史记录仍然被截断。请参阅下面的答案,以获得更完整的解决方案。
fotinakis 2014年

2
警告:这会引起头痛gdb;如果您设置HISTSIZE变量,则将其设为0,从而完全禁用历史记录大小。
Matteo Italia

2
注意:不需要exportHISTFILESIZE以行数(而不是字节数)为单位,并且在设置变量 HISTFILESIZE(以及退出shell时)历史记录文件会被截断。因此,请勿在配置文件中用不同的值设置两次...
vaab 2015年

@vaab:如果不导出HISTFILE,则看不到我的历史文件在子外壳中使用“ echo $ HISTFILE”的内容,因此虽然没有必要,但它可能会有所帮助,并且不会对我造成伤害。
Jeff Learman '16

41

(从https://stackoverflow.com/a/19533853/128597转发我的答案)

多年来,经过了许多大的,丑陋的迭代和怪异的边缘案例之后,我现在在.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".
# https://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启动时间的影响。


4
设置时HISTFILESIZE,历史记录文件将被截断,这就是为什么您应删除任何此类事件的发生原因(除了所需的事件)。它也会在shell出口处被截断(但这是预期的)。而且您不需要export
vaab 2015年

3
@vaab如果不导出,则执行类似的操作bash --norc将再次截断历史记录。
Wu

1
export HISTFILE="/home/$USER/hist/`uname -n``tty | tr '/' '-'`"过去常常将每个会话的shell历史记录分开(基于主机名和tty名称)。当然,我必须先创建〜/ hist目录。
杰夫·里尔曼

2
请注意,您可能需要检查PROMPT_COMMAND的值,而不是盲目地重复附加此值,因为它将使您的系统疯狂。空检查或更好的shell变量扩展搜索可能更安全。
dragon788

3
我用它来避免提到@ dragon788的问题:PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";
Brian Vandenberg

9

包含在〜/ .bashrc中

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=

该答案满足以下条件:

  1. 单独的主历史记录(任何会话都不能中断您的历史记录)

  2. 自动历史记录编写(无热键)

  3. 很少写入(在每个命令后都不能追加)

背景

在交互式启动时,如果$HISTFILESIZE将其设置为一个数字,则bash会截断$HISTFILE为该数字。交互式关闭时,如果histappend设置了shell选项,则bash会将$HISTSIZE行追加到$HISTFILE,否则将覆盖$HISTFILE

OSX技巧(终端)

每次在Terminal中创建一个标签时,~/.bash_profile都会读取该标签,这意味着bash不会继续读取您的~/.bashrc。将以下行添加到您的~/etc/bash_profile

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc

屏幕提示

如果使用屏幕,则配置文件为〜/ .screenrc。如果您想让屏幕记录历史,则只需将其设置为使用登录外壳即可,该外壳将提供您的bash启动文件(并记录您的历史)。

# use bash, make it a login shell
defshell -bash

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.