首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运行多个会话时的奇怪bash历史行为

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

Server Fault用户
提问于 2011-12-02 18:38:47
回答 3查看 2.6K关注 0票数 16

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

有人能解释一下吗?

是否有一种方式来控制历史,以便我可以从特定的窗口重用历史记录?

EN

回答 3

Server Fault用户

回答已采纳

发布于 2011-12-02 19:31:44

要了解bash历史的行为,首先必须知道以下几点:

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

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

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

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

有关启动和关闭过程的更详细说明,请阅读巴什手册

注意,对于默认设置,我指的是bash中的默认设置。您的发行版可能提供了一个更改此行为的.bashrc (或/etc/bash.bashrc)。

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

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

使用内置命令history,您可以显式地告诉bash从一个文件读取到另一个内存的历史记录,或者告诉bash从内存到文件的写入。例如:history -r将读取文件的内容并将其附加到内存中的历史记录中。history -w将将当前历史记录从内存写入到文件,覆盖以前的内容。这基本上是在关机期间发生的事情。阅读有关history命令在巴什手册中的更多信息

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

  • HISTFILE:要读取并将历史记录写入的文件。
  • HISTFILESIZE:历史文件的最大行数。
  • HISTSIZE:内存中历史记录的最大行数。
  • HISTCONTROLHISTIGNOREHISTTIMEFORMAT:与此讨论无关。有关详细信息,请阅读巴什手册
票数 14
EN

Server Fault用户

发布于 2011-12-02 19:03:51

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

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

票数 2
EN

Server Fault用户

发布于 2011-12-02 18:52:03

AFAIK,bash命令在SSH会话结束后保存。因此,当会话异常终止时(例如,由于网络故障),命令不会保存。我在这里说的是SSH会议。本地终端可以使用类似的方法。

当同时打开多个会话时,在一个会话上键入的命令在另一个会话上没有显示,而它们都处于活动状态。但是,当您终止会话时,您将看到这些命令-重新打开它。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/337123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档