我经常执行两个命令。假设第一个是'abcd',第二个是'abc'。所以我的历史包含
1000 abc arg1 arg2 arg3
1001 abcd arg1 arg2 arg3
现在如果我在bash中输入!abcd
,它会执行abcd命令。这很好。但是如果我在bash中键入!abc
,它也会执行最后一个abcd命令(因为它匹配开头并且“newer”)
如何使用bash历史记录获取最后一个abc命令?我尝试过!'abc '
和"!abc\ "
反斜杠空间。
答案 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历史记录,即在前向和后向方向上效率更高,速度更快:
可以轻松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...