【问题标题】:Understanding `history` for bash了解 bash 的“历史”
【发布时间】:2015-08-18 22:14:03
【问题描述】:

昨天我ssh-d 进入我的 RemoteFS 并执行了一些命令。

今天他们没有出现在历史上。令人沮丧,因为我花了一些时间查看我使用的命令。

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

有人可以科学地解释历史的生命周期吗?什么时候创建一个新的?如何访问/查看所有现有的?在什么情况下历史会被摧毁?他们会合并吗?

【问题讨论】:

  • man bash 有一个关于历史的部分。
  • 使用sudo(8) 以其他用户身份记录您的命令。使用script(1) 简单地记录您的终端会话。 Shell 历史记录对导航很有用,但您不能依靠它来跟踪您所做的一切。

标签: bash history


【解决方案1】:

取决于变量设置,但默认情况下,每个用户只有一个历史文件,而不是每个终端会话。

如今,历史记录保存在内存缓冲区中,并且仅在缓冲区已满或注销时才写入历史记录文件。因此,同一用户下的多个终端会话可以覆盖彼此的历史记录。历史系统并不真正适合同一用户 id 下的多个会话。

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

设置起来可能看起来很整洁:

HISTFILE="$HOME/.bash_history$$"

其中$$ 给出当前PID。虽然这为每个终端会话提供了自己的历史记录,但它很快成为维护的噩梦,所有这些历史文件都四处飘荡。

还有其他控制历史的变量,请参阅man bash 了解说明。您还可以:

set | grep '^HIST'

这可能是有启发性的。

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

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

如何访问/查看所有现有的?取决于你给它们起什么名字。

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

shopt -s histappend

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

他们会合并吗?不,除非你写了一个脚本来做,或者你设置了histappend

【讨论】:

  • 我的 .bash_history 是一个文本文件(尽管是 UTF-8 编码的)。
  • PROMPT_COMMAND 中运行history -a 可以帮助跨多个会话合并历史记录,尽管您可能并不总是喜欢由此产生的线性化(尤其是如果您一次在多个会话中积极工作)。
  • @chepner:我不得不承认我正在查看一个 korn shell (ksh93) 历史文件,其中行号是二进制 int。是的,我认为附加多个会话没有用。
猜你喜欢
  • 2016-12-30
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2021-01-25
  • 2015-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多