如何通过精确搜索访问bash历史记录,而不是前缀1?

时间:2009-05-14 16:10:56

标签: bash unix

我经常执行两个命令。假设第一个是'abcd',第二个是'abc'。所以我的历史包含

1000 abc arg1 arg2 arg3
1001 abcd arg1 arg2 arg3

现在如果我在bash中输入!abcd,它会执行abcd命令。这很好。但是如果我在bash中键入!abc,它也会执行最后一个abcd命令(因为它匹配开头并且“newer”

如何使用bash历史记录获取最后一个abc命令?我尝试过!'abc '"!abc\ "反斜杠空间。

9 个答案:

答案 0 :(得分:6)

您可以尝试反向历史搜索:Ctrl-R。在出现的提示符下,键入命令行的部分内容(增量文本搜索)。

如果要切换到上一个匹配项,请再键入一次Ctrl-R。

在你的“两个相似的行”案例中,

Ctrl-R abc Ctrl-R

Ctrl-R abc<SPACE>

可能会这样做

答案 1 :(得分:3)

由于Bash使用readline,请尝试将其添加到~/.inputrc并重新启动Bash:

"\e[5~": history-search-backward
"\e[6~": history-search-forward

这样您只需输入

即可
$ abc <PgUp>

检索以"abc "开头的历史记录中的最后一项。

有人建议在一些流行的Linux发行版中将这些绑定添加到默认的/etc/inputrc ...我不记得它是什么。

答案 2 :(得分:2)

这不会直接回答您的问题,但如果您经常执行这些命令,您可以考虑在相应的登录点文件中添加别名或函数定义,以便您可以使用1个字母的命令执行它们:

alias a="abc arg1 arg2 arg3"
alias b="abcd arg1 arg2 arg3"

答案 3 :(得分:1)

如果您知道历史记录编号,则可以

!1000

或使用

!-2

参考前一行。

答案 4 :(得分:1)

您要问的一种方法是使用bash中的历史搜索功能。使用emacs键绑定(默认设置),您可以按CTRL-r。使用vi键绑定时,请使用ESC /。这也可以让你搜索命令的其他部分。

答案 5 :(得分:1)

尝试:

!?abc ?

这是第二个问号之前的空格。请注意,这个(!?)会在命令行的任何地方找到“abc <space>”而不仅仅是“!”将。第二个问号意味着字符串后面可能有其他文本(例如你的args)以及分隔空格字符。

答案 6 :(得分:1)

如果您希望将历史记录保留在历史记录中,请将其放入bash启动(.bash_profile或.bashrc)

export HISTCONTROL="ignoredups"

答案 7 :(得分:0)

你可能想尝试https://github.com/dvorka/hstr,这允许&#34;建议框样式&#34;使用(可选)基于排序的指标过滤Bash历史记录,即在前向和后向方向上效率更高,速度更快:

enter image description here

可以轻松bound Ctrl-r 和/或 Ctrl-s

答案 8 :(得分:0)

这里有很多好主意。我想再添加一个。为了通过 bash 历史搜索 (Ctrl-r) 更轻松地找到常用命令,我所做的一件事是在末尾添加诸如 #useful 之类的注释,使其变为 echo I need this command or command sequence all the time #useful。然后我可以使用 Ctrl-r#useCtrl-rCtrl-r...

循环这些命令