查看 bash 历史记录中实际输入的命令

查看 bash 历史记录中实际输入的命令

是否可以检索 bash 历史记录中输入的实际命令?如果命令涉及(例如)历史记录替换或修饰符,则历史记录中看到的是结果命令,而不是输入的命令。

举几个例子。对于这两个例子,假设历史记录中的命令 123 是ls Red*

  1. 如果我从历史记录中输入!123使用命令行 123,现在查看历史记录中的最新命令,我将看到ls Red*而不是!123

  2. 如果使用内置的 shell 命令fc -s Red=Blue 123并查看历史记录,我将ls Blue*看到fc -s Red=Blue 123

类似地,如果我使用向上箭头(产生转义序列^[[A),我会得到扩展的命令而不是实际输入的文本。

在所有这些示例中,历史记录中的结果条目都是我所期望的,但在某些情况下,检索最初输入的文本会很有用。例如,虽然上述示例非常简单,但我可能会使用我想要编辑的复杂替换。

我意识到在初始化 shell 后,情况会变得更加复杂,因为 aHISTFILE不包含此信息。在这种情况下,我并不关心如何检索原始文本(尽管这很有趣)。

答案1

对你提出的问题的实际回答是“不,bash 没有这样的功能”。这是我十年前在与核心 GNU 团队在同一栋大楼里工作时想到的,所以我去和他们交谈,显然,添加这个会很麻烦(包括弄清楚语法和存储所有额外的历史记录)。很多人偶尔会受益,但有很多更大的问题需要解决,所以不太可能得到解决。

另一方面,我经常发现使用 X11 的剪切粘贴功能几乎可以在所有情况下满足我的实际需求。发现以下XResource神奇功能后,情况变得更好:

*cutToBeginningOfLine:      False

如果您知道XResources 在哪里,则可以将此行添加到该文件中。如果您无法确定,则可以将其添加echo '*cutToBeginningOfLine: False'|xrdb -merge到您的某个启动文件中(例如.profile,但取决于您的 shell)。

这样做的作用是,单击鼠标左键三次,将您指向的单词复制到行尾(包括Enter),然后您可以轻松地粘贴它。默认情况下(即没有这个),单击三次会复制包括提示符在内的整行。

相关内容