bash 命令历史记录中的跨会话重复删除

bash 命令历史记录中的跨会话重复删除

问题背景:

  • 总是活跃ignoreboth并且erasedups
  • HIST_SIZEFILESIZE具有期望/实际限制不同的我们用户的历史记录
  • 几乎总是有多个并行会话和(通常)嵌套会话

预期行为:

  • 关闭任何会话并重新打开其他会话后,任何会话的历史记录中不应有重复内容。

  • 我们不需要在打开另一个会话之前关闭所有会话

  • 活动会话的历史记录不得受到其他正在运行/关闭的会话的影响(因此,为所有会话选择单一历史记录并不是一个解决方案)

  • 另一方面,新会话应该(自然地)在打开之前关闭所有部分的历史记录行(当然,没有重复)

行为:

  1. 在某些机器上启动一个没有任何其他并行会话的会话

  2. 假设一个已保存历史记录² 最后 3 行:

    ./reference-point  # anything, just to use as a reference
    ls
    la
    ll
    
  3. 启动一个嵌套会话(ssh 甚至 bash 命令,也将保留在历史记录中)。我会做一个简单的:

    ssh machine
    
  4. 发出 3 个命令,每个命令至少一次,并且顺序可能不同。例如:

    ll
    ls
    la
    ll
    
  5. 我们的最后 4 行应该是:

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    
  6. 现在我们关闭此会话(使用 CTRL+D 或任何未保留在历史记录中的内容)。现在,在我们的第一次会话中,最后 5 行应该是:

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    ssh machine
    
  7. 关闭此会话(这是目前唯一活动的会话)

  8. 启动另一个会话并检查最后 10 条历史记录:

    ./reference-point  # anything, just so we know
    ls
    la
    ll
    ls
    la
    ll
    ssh machine
    

这个例子使历史重复彼此粘在一起。但实际用途当然不行。不好的副作用是无法从我们可以使用的配置中猜测历史记录大小。此外,这种行为显然是错误的。

除了增加超出我想要的“HIST*SIZE”配置之外,我还能做些什么来解决它,或者(至少)更好地处理这个问题?


我想做一些笔记:

这个错误已经很老了,我不知道有谁提出了真正的解决方案。而且,对于我的具体情况,网络上给出的一些解决方案可能会存在问题或小“问题”。

这个问题已经被2014年报道萨凡纳。但直到今天似乎还没有人读过它。您可以检查它(也许甚至可以在那里发表一些有用的评论,因为它是 Bash 的官方场所)。

--

嵌套会话对我来说是必要的,并且应该很常见。例如:ssh 到关闭的网络访问计算机,然后再次登录到一台或多台计算机(在并行会话中,也很常见)

² 要检查历史记录行而不影响保留的命令,您可以使用“ignoreboth”Bash 配置,只需执行“history 10”(注意命令前的空格!)或类似操作。我在写这个问题的时候就用这个来做测试。

相关内容