运行多个会话时出现奇怪的 bash 历史行为

Ale*_*man 15 linux bash command-line-interface

当我使用多个终端窗口时,命令行历史是如何存储的?我知道它存储在,.bash_history但如果我打开新窗口,我看不到使用什么历史记录的逻辑。从某种意义上说,几乎感觉是不确定的,如果我尝试在新窗口中使用向上箭头,我永远不知道我会看到什么命令。

有人可以解释一下吗?

有没有办法以可以重用特定窗口中的历史记录的方式控制历史记录?

les*_*ana 14

要首先了解 bash 历史记录的行为,您必须了解以下内容:

  1. 历史文件中有历史记录。
  2. bash 进程的内存中有历史记录。
  3. 一个 bash 进程内存中的历史不会与任何其他 bash 进程内存中的历史同步。
  4. bash 进程内存中的历史记录不会与文件中的历史记录同步,除非明确要求或在某些特定事件期间(见下文)。

使用默认设置,bash 会话相对于历史的生命周期如下:

  1. 在启动期间,bash 将读取历史文件。历史文件的内容现在在 bash 进程的内存中。
  2. 在正常使用期间,仅操作内存中的历史记录。
  3. 在关机期间,内存中的历史记录被写入历史文件,覆盖历史文件的任何先前内容。

您观察到的看似不确定的行为,主要是因为历史文件的内容始终是上次关闭的 bash 会话的历史记录,而 bash 仅在启动时读取历史文件。

阅读bash 手册以获取有关启动和关闭过程的更详细说明。

请注意,默认设置是指来自 bash 的默认设置。您的发行版可能提供了一个.bashrc(或/etc/bash.bashrc)来改变这种行为。

通过启用 shell 选项,histappend您可以告诉 bash 追加而不是覆盖历史文件。您可以histappend使用命令启用shopt -s histappend。要始终启用此选项,您必须将命令放入.bashrc(或其他初始化文件)中。shoptbash 手册中阅读有关该命令的更多信息

请注意,启用histappend不会减少很多看似不确定的行为。这是因为每个 bash 会话在内存中仍然有自己的历史记录。有可能拥有大部分同步的 bash 历史记录。有一个指南如何让每个 bash 进程在堆栈溢出的线程中具有大部分同步的历史记录。

使用内置命令,history您可以明确告诉 bash 从文件读取历史记录到内存,或从内存写入文件。例如:history -r将读取文件的内容并将其附加到内存中的历史记录中。history -w将当前历史从内存写入文件,覆盖之前的内容。这基本上是关闭期间发生的情况。historybash 手册中阅读有关该命令的更多信息

为了完整起见,这里是修改历史行为的内部变量列表:

  • HISTFILE:要读取和写入历史记录的文件。
  • HISTFILESIZE: 历史文件的最大行数。
  • HISTSIZE:内存中历史记录的最大行数。
  • HISTCONTROL, HISTIGNORE, HISTTIMEFORMAT: 与本次讨论无关。有关详细信息,请阅读bash 手册