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

Dra*_*gos 95 linux bash shell

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

小智 88

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

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

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

来自man bash

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

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

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

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

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

export HISTTIMEFORMAT="%F %T "
Run Code Online (Sandbox Code Playgroud)

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

  • 这实际上在很多情况下都不起作用,而且 bash 历史记录仍然会被截断。有关更完整的解决方案,请参阅下面的答案。 (4认同)
  • 注意:你不需要 ``export``,``HISTFILESIZE`` 是行数(不是字节),历史文件 ** 截断发生在你设置变量** ``HISTFILESIZE`` 时(以及当 shell退出)。所以不要在你的配置文件中用不同的值设置两次...... (4认同)
  • 警告:这会导致 `gdb` 头痛;如果你设置一个 `HISTSIZE` 变量,它将把它当作 0,从而完全禁用历史大小。 (2认同)

fot*_*kis 49

多年来,经过许多大型、丑陋的迭代和奇怪的边缘情况,我现在有一个专门用于此的.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".
# /sf/ask/662006341/
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)

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

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

  • 当您设置“HISTFILESIZE”时,历史文件会被截断,这就是为什么您应该删除除您想要的之外的任何此类事件的发生。它也会在 shell 退出时被截断(但这是意料之中的)。你不应该需要“出口”。 (6认同)
  • @vaab 如果您不导出,则执行类似`bash --norc` 之类的操作将再次截断历史记录。 (4认同)
  • 请注意,您可能需要检查 PROMPT_COMMAND 的值,而不是盲目地重复添加它,因为它会对您的系统造成疯狂的影响。空检查或更好的 shell 变量扩展搜索可能更安全。 (3认同)
  • 我用它来避免@dragon788 提到的问题:`PROMPT_COMMAND="${PROMPT_COMMAND:+${PROMPT_COMMAND} ;}history -a";` (3认同)

cdo*_*orn 10

包含在~/.bashrc 中

# append a session's history on shell exit
shopt -s histappend
export HISTFILESIZE=
export HISTSIZE=
Run Code Online (Sandbox Code Playgroud)

此答案满足以下条件:

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

  2. 自动历史写入(无热键)

  3. 不频繁的写入(在每个命令之后没有附加)

背景

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

OSX 提示(终端)

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

# if bashrc has content, source it
[[ -s ~/.bashrc ]] && . ~/.bashrc
Run Code Online (Sandbox Code Playgroud)

屏幕提示

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

# use bash, make it a login shell
defshell -bash
Run Code Online (Sandbox Code Playgroud)