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

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

有没有办法在 Bash 中定义无限的历史记录?

答案1

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

export HISTFILESIZE=
export HISTSIZE=

就这样,无限历史。目前我有 27000 个条目 :)

man bash

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

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

同样的情况似乎也适用于HISTSIZE,尽管我找不到相关记录。

我要尝试的另一个巧妙的功能是:

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

export HISTTIMEFORMAT="%F %T "

如果您已经尝试过的话请告诉我...

答案2

经过多年的大规模、丑陋的迭代和奇怪的边缘情况,我现在有了一个简洁的部分我的.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 启动时间有太大的影响。

答案3

包括~/.bashrc

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

这个答案满足以下标准:

  1. 单独的主历史记录(没有会话可以打断您的历史记录)

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

  3. 不频繁写入(每个命令后不附加任何内容)

背景

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

OSX 提示(终端)

每次在终端中创建一个选项卡时,~/.bash_profile都会读取它,这意味着 bash 不会继续读取你的~/.bashrc。将以下行添加到你的~/etc/bash_profile

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

屏幕提示

如果您使用 screen,您的配置文件是 ~/.screenrc。如果您希望 screen 记录历史记录,您只需将其设置为使用登录 shell,该 shell 将获取您的 bash 启动文件(并记录您的历史记录)。

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

答案4

抱歉,答案可能有点迟了,但为了完整性:在我这里(Debian Bullseye)可以工作

HISTSIZE=-1 
HISTFILESIZE=-1

相关内容