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

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

有人可以解释这个吗?

有没有办法以这样的方式来控制历史,我可以从特定的窗口重用历史?

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

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

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

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

您观察到的看似不确定的行为主要是因为历史文件的内容始终是最后closures的bash会话的历史logging,而bash仅在启动期间读取历史logging文件。

阅读bash手册以获取关于启动和closures过程的更详细的解释。

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

通过启用shell选项histappend你可以告诉bash追加而不是覆盖历史文件。 您可以使用命令shopt -s histappend 。 要始终启用此选项,必须将该命令放在.bashrc (或其他初始化文件)中。 在bash手册中详细了解shopt命令

请注意,启用histappend不会减less表面上非确定性的行为。 这是因为每个bash会话在内存中都有自己的历史。 有可能有一个基本同步的bash历史。 有一个指导如何让每个bash进程在堆栈溢出的线程中有一个主要同步的历史。

使用内置的命令history你可以明确地告诉bash从文件读到内存的历史,或从内存写入文件。 例如: history -r将读取文件的内容并将其附加到内存中的历史logging。 history -w将把当前历史从内存写入文件,覆盖以前的内容。 这基本上是在关机过程中发生的。 在bash手册中阅读关于history命令的更多信息

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

  • HISTFILE :从历史读取和写入历史的文件。
  • HISTFILESIZE :历史文件的最大行数。
  • HISTSIZE :内存中历史logging的最大行数。
  • HISTCONTROLHISTIGNOREHISTTIMEFORMAT :与本次讨论无关。 阅读bash手册了解详情。

http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively

您可能可以通过其中一个terminal来操作历史文件的写入方式,即在要保存历史logging的terminal中执行“history -a”或“history -w”,然后在“history -r”中执行其他terminal。 取决于你想做什么。

AFAIK,bash命令在SSH会话终止后被保存。 所以,当会话exception终止时(例如,由于networking故障),命令不会被保存。 我在这里谈论SSH会话。 本地terminal可能使用类似的方法。

当同时打开多个会话时,在一个会话中键入的命令在两个都处于活动状态时不会在另一个会话中看到。 但是,当您终止会话时,您将看到这些命令重新打开它。