加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 18:39:07 所属栏目:Linux 来源:网络整理
导读:当我使用多个终端窗口时,如何存储命令行历史记录?我知道它存储在.bash_history中,但如果我打开新窗口,我无法看到使用历史记录的逻辑. 从某种意义上说,如果我尝试在新窗口中使用向上箭头,我永远不知道会看到什么命令,这几乎感觉不确定. 有人可以解释一下吗?
当我使用多个终端窗口时,如何存储命令行历史记录?我知道它存储在.bash_history中,但如果我打开新窗口,我无法看到使用历史记录的逻辑.
从某种意义上说,如果我尝试在新窗口中使用向上箭头,我永远不知道会看到什么命令,这几乎感觉不确定.

有人可以解释一下吗?

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

解决方法

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

>历史文件中有历史记录.
>在bash过程的记忆中有历史.
>一个bash进程内存中的历史记录与任何其他bash进程的内存中的历史记录不同步.
> bash进程内存中的历史记录不会与文件中的历史记录同步,除非明确询问或在某些特定事件期间(见下文).

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

>在启动期间,bash将读取历史文件.历史文件的内容现在位于bash进程的内存中.
>在正常使用期间,仅操作存储器中的历史记录.
>在关闭期间,内存中的历史记录将写入历史记录文件,覆盖历史记录文件的任何先前内容.

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

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

请注意,默认设置是指bash的默认设置.您的发行版可能提供了.bashrc(或/etc/bash.bashrc)来更改此行为.

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

请注意,启用histappend不会减少看似不确定的行为.这是因为每个bash会话在内存中仍然拥有自己的历史记录.可以具有大部分同步的bash历史.有一个指南如何让每个bash进程在a thread on stack overflow中具有大致同步的历史记录.

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读