问题背景:
- 总是活跃
ignoreboth
并且erasedups
HIST_SIZE
并FILESIZE
具有期望/实际限制不同的我们用户的历史记录- 几乎总是有多个并行会话和(通常)嵌套会话
预期行为:
关闭任何会话并重新打开其他会话后,任何会话的历史记录中不应有重复内容。
我们不需要在打开另一个会话之前关闭所有会话
活动会话的历史记录不得受到其他正在运行/关闭的会话的影响(因此,为所有会话选择单一历史记录并不是一个解决方案)
另一方面,新会话应该(自然地)在打开之前关闭所有部分的历史记录行(当然,没有重复)
行为:
在某些机器上启动一个没有任何其他并行会话的会话
假设一个已保存历史记录² 最后 3 行:
./reference-point # anything, just to use as a reference ls la ll
启动一个嵌套会话(ssh 甚至 bash 命令,也将保留在历史记录中)。我会做一个简单的:
ssh machine
发出 3 个命令,每个命令至少一次,并且顺序可能不同。例如:
ll ls la ll
我们的最后 4 行应该是:
./reference-point # anything, just so we know ls la ll
现在我们关闭此会话(使用 CTRL+D 或任何未保留在历史记录中的内容)。现在,在我们的第一次会话中,最后 5 行应该是:
./reference-point # anything, just so we know ls la ll ssh machine
关闭此会话(这是目前唯一活动的会话)
启动另一个会话并检查最后 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”(注意命令前的空格!)或类似操作。我在写这个问题的时候就用这个来做测试。