了解Bash的“history”

3

昨天我通过ssh登录到我的RemoteFS并执行了一些命令。

今天这些命令在历史记录中不再出现。很令人沮丧,因为查看我使用的命令花费了一些时间。

我经常遇到这个问题。我怀疑使用相同的登录名进行多个同时终端会话可能会导致每个会话有一个单独的历史记录。而更改用户(例如提升为超级用户)则会打开一个不同的历史记录集。

能否有人科学地解释一下历史记录的生命周期?何时会创建新的历史记录?如何访问/查看所有现有的历史记录?在什么情况下会销毁历史记录?它们是否会被合并?


1
man bash 中有一个关于 HISTORY 的部分。 - choroba
1
http://unix.stackexchange.com/q/1288/16178 - perreal
使用 sudo(8) 以另一个用户身份记录您的命令。使用 script(1) 简单地记录您的终端会话。Shell 历史记录对于导航很有用,但您不能依赖它来跟踪您所做的一切。 - lcd047
1个回答

2

根据变量设置不同,但默认情况下每个用户只有一个历史记录文件,而不是每个终端会话一个。

现在,历史记录存储在内存缓冲区中,只有当缓冲区已满或注销时才写入历史记录文件。因此,在同一用户下的多个终端会话中可以互相覆盖彼此的历史记录。历史记录系统并不适用于同一用户ID下的多个会话。

如果您想要保持会话分开,请修改变量HISTFILE

似乎将其设置为:

HISTFILE="$HOME/.bash_history$$"

$$ 表示当前进程的PID。虽然这使每个终端会话都有自己的历史记录,但所有这些历史文件会很快变成一个维护噩梦。

还有其他控制历史记录的变量,请参见 man bash 进行了解。您也可以执行以下操作:

set | grep '^HIST'

这可能是有用的指导。

不要试图使用文本编辑器编辑历史文件,因为它是一个二进制文件(包含非文本字段),很容易被损坏。

什么时候会创建新的历史文件?当第一次使用历史文件名时。

如何访问/查看所有现有的历史文件?取决于您给它们的名称。

在什么情况下会销毁历史记录?HISTSIZE超过限制时(默认为500行)。只有HISTSIZE行被存储。请记住,只有当内存缓冲区已满或注销时才会覆盖文件本身。但是我们有histappend选项:

shopt -s histappend

这将会追加会话而不是覆盖。使用时要小心,否则可能会得到一个巨大的历史文件。

它们是否会合并? 不会,除非你编写一个脚本来实现,或者设置 histappend


我的.bash_history是一个文本文件(虽然是UTF-8编码)。 - chepner
PROMPT_COMMAND中运行history -a可以帮助合并多个会话的历史记录,尽管您可能不总是喜欢结果的线性化(特别是如果您同时在多个会话中积极工作)。 - chepner
@chepner:我必须承认,我正在查看一个korn shell (ksh93)历史文件,其中行号是二进制的“int”。是的,在我看来,追加多个会话并没有什么用处。 - cdarke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接