当您重新使用和编辑以前的命令时,bash 的某些实例会更改命令历史记录,而其他实例显然不会。我一直在搜索和搜索,但找不到任何说明如何防止历史记录中的命令在重用和编辑时被修改的内容。
有这样的问题这一个,但似乎说如何应对历史正在编辑。我最近才遇到一个 bash 实例,它在您重用命令时会编辑历史记录 - 我以前使用过的所有 bash shell(据我所知)都被配置为在您重用时不会更改历史记录并编辑命令。(也许我在过去 15 年左右的时间里没有适当关注我的 shell 历史......)
所以这可能是最好的问题:我可以告诉 bash 永远不要修改历史记录 - 如果可以,如何修改?
通过向上按,我可以查看以前输入的命令。我注意到,如果我修改其中一个,就会改变历史。例如,如果我输入:
echo a
echo b
echo c
[up][up][backspace]d[ctrl+c]
Run Code Online (Sandbox Code Playgroud)
历史现在显示第二个命令是echo d
,不是echo b
。如何保持echo b
历史第一?
例如,假设我运行了一个非常长的命令,有很多选项。然后我想再次运行它,稍作改动,所以我回顾历史以找到它,进行更改,但后来意识到实际上我不需要重新运行它,只是想到了另一个选择来代替。然后,我想回去提醒自己我运行的命令是什么 - 但是等等,历史现在显示错误的东西!
这种情况很少出现,但一旦出现,我就觉得很烦人。有没有办法自动保留原始历史记录?
在 bash 交互式 shell 中输入命令时出现拼写错误的情况并不罕见。我希望能够纠正 bash 历史记录中的拼写错误,以便错误的命令不会污染它并导致我稍后意外地重新执行它。特别是,我想编辑最后一个命令。
有很多 问题 询问如何防止意外编辑bash 历史记录 。我想要相反:我想明确编辑历史记录。
根据参考问题的一些解释,我尝试这样做:
$ echo foo
Run Code Online (Sandbox Code Playgroud)
按Up,将其更改为:
$ echo foobar
Run Code Online (Sandbox Code Playgroud)
按Down,但这没有任何作用,如果我然后按Enter,它将执行修改后的命令并保留两者
echo foo
echo foobar
Run Code Online (Sandbox Code Playgroud)
在我的历史中。
我知道我可以使用 手动删除历史记录条目history -d
,但我还没有设计出一种方便使用它的好方法。我不想创建一个 shell 函数来无条件删除最后一个历史条目,因为我仍然希望能够使用它Up来加载最后一个条目,以便我可以更正它。我可以进行更正,然后删除倒数第二个历史条目,但这感觉很笨拙,而且对于长时间运行的命令来说尤其烦人,因为我要么需要记住稍后执行额外的步骤,要么需要暂时暂停执行这些步骤,然后继续。
我想要的是:
理想情况下,我希望能够做的是按Up,对之前的命令进行更正,然后按一些特殊的键绑定或向命令行添加一些魔术标记,以使其在执行时替换历史记录条目。
也可以接受的是按其他按键序列从历史记录中检索和编辑命令(类似于 Ctrl+R),该命令在执行时会覆盖历史记录条目。
删除倒数第二个历史条目的强大shell函数是可以接受的,但并不理想。
我想其他人肯定也会犯错,并且当这些命令污染他们的历史时也会同样感到恼火。其他人做什么?