Answers:
要首先了解bash历史记录的行为,您必须了解以下内容:
使用默认设置,关于历史记录的bash会话的生命周期如下:
您观察到的看似不确定的行为,主要是因为历史记录文件的内容始终是上次关闭的bash会话的历史记录,并且bash仅在启动期间读取历史记录文件。
阅读bash手册,以更详细地说明启动和关闭过程。
请注意,默认设置是指bash的默认设置。您的发行版可能提供了.bashrc
(或/etc/bash.bashrc
)来更改此行为。
通过启用shell选项,histappend
您可以告诉bash追加而不是覆盖历史文件。您可以histappend
使用命令启用shopt -s histappend
。要始终启用此选项,必须将命令放入您的.bashrc
(或其他初始化文件)中。shopt
在bash手册中阅读有关命令的更多信息
请注意,启用histappend
不会显着减少看似不确定的行为。这是因为每个bash会话在内存中仍然具有其自己的历史记录。可能具有大部分同步的bash历史记录。有一个指南介绍了如何使每个bash进程在堆栈溢出时的线程中具有基本同步的历史记录。
使用内置命令,history
您可以明确告诉bash从文件到内存读取历史记录,或从内存到文件写入历史记录。例如:history -r
将读取文件的内容并将其附加到内存中的历史记录中。history -w
会将当前历史记录从内存写入文件,覆盖以前的内容。这基本上是关机期间发生的情况。history
在bash手册中阅读有关命令的更多信息
为了完整起见,以下是修改历史记录行为的内部变量的列表:
HISTFILE
:要读取和写入历史记录的文件。HISTFILESIZE
:历史文件的最大行数。HISTSIZE
:内存中历史记录的最大行数。HISTCONTROL
,HISTIGNORE
,HISTTIMEFORMAT
:对于这个讨论不相关的。阅读bash手册以了解详细信息。.bashrc
文件再次进行实验。请注意,您的发行版可能已更改了中的某些设置/etc/bash.bashrc
。专门检查shell选项histappend
。
http://www.gnu.org/software/bash/manual/bashref.html#Using-History-Interactively
您也许可以使用其中一个终端来操作如何写入历史文件,即,在要保存历史的终端中执行“ history -a”或“ history -w”,然后在其中保存“ history -r”其他终端。取决于您要做什么。
AFAIK,bash命令在SSH会话终止后被保存。因此,当会话异常终止(例如,由于网络故障)时,不会保存命令。我在这里谈论的是SSH会话。本地终端可以使用类似的方法。
当同时打开多个会话时,在一个会话上键入的命令都处于活动状态,而在另一会话上则看不到它们。但是,当您终止会话重新打开它时,您将看到这些命令。