我经常执行两个命令。假设第一个是'abcd',第二个是'abc'。所以我的历史包含
1000 abc arg1 arg2 arg3
1001 abcd arg1 arg2 arg3
现在如果我在bash中输入!abcd
,它会执行abcd命令。这很好。但是如果我在bash中键入!abc
,它也会执行最后一个abcd命令(因为它匹配开头并且是“更新”)
如何使用bash历史记录获取最后一个abc命令?我试过!'abc '
和"!abc\ "
反弹空间。
您可以尝试反向历史搜索:Ctrl-R。在出现的提示符下,键入命令行的部分内容(增量文本搜索)。
如果要切换到上一个匹配项,请再键入一次Ctrl-R。
在你的“两个相似的行”的情况下,
Ctrl-R abc Ctrl-R
要么
Ctrl-R abc<SPACE>
可能会这样做
由于Bash使用readline,尝试将其添加到~/.inputrc
并重新启动Bash:
"\e[5~": history-search-backward
"\e[6~": history-search-forward
这让你只需输入
$ abc <PgUp>
检索以"abc "
开头的历史记录中的最后一项。
有人建议在一些流行的Linux发行版中将这些绑定添加到默认的/etc/inputrc
...我不记得它是什么。
这不会直接回答您的问题,但如果您经常执行这些命令,您可以考虑在相应的登录点文件中添加别名或函数定义,以便您可以使用1个字母的命令执行它们:
alias a="abc arg1 arg2 arg3"
alias b="abcd arg1 arg2 arg3"
如果你知道历史编号,你可以
!1000
或使用
!-2
参考之前的行。
你要问的一种方法是使用bash中的历史搜索功能。使用emacs键绑定(默认值),您可以按CTRL-r
。使用vi keybindings使用ESC /
。这也可以让您搜索命令的其他部分。
尝试:
!?abc ?
这是第二个问号之前的空格。请注意,这个(!?)会在命令行的任何地方找到“abc<space>
”而不仅仅是“!”将。第二个问号意味着字符串后面可能有其他文本(例如你的args)以及分隔空格字符。
如果你想保留历史记录,请将其放入bash启动(.bash_profile或.bashrc)
export HISTCONTROL="ignoredups"
您可能想尝试https://github.com/dvorka/hstr,它允许使用(可选)基于排序的Bash历史记录的“建议框样式”过滤,即在向前和向后方向上更有效和更快:
它可以很容易地bound到Ctrl-r和/或Ctrl-s