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

问题描述 投票:2回答:8

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

1000 abc arg1 arg2 arg3
1001 abcd arg1 arg2 arg3

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

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

bash unix
8个回答
6
投票

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

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

在你的“两个相似的行”的情况下,

Ctrl-R abc Ctrl-R

要么

Ctrl-R abc<SPACE>

可能会这样做


3
投票

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

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

这让你只需输入

$ abc <PgUp>

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

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


2
投票

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

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

1
投票

如果你知道历史编号,你可以

!1000

或使用

!-2

参考之前的行。


1
投票

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


1
投票

尝试:

!?abc ?

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


1
投票

如果你想保留历史记录,请将其放入bash启动(.bash_profile或.bashrc)

export HISTCONTROL="ignoredups"

0
投票

您可能想尝试https://github.com/dvorka/hstr,它允许使用(可选)基于排序的Bash历史记录的“建议框样式”过滤,即在向前和向后方向上更有效和更快:

它可以很容易地bound到Ctrl-r和/或Ctrl-s

© www.soinside.com 2019 - 2024. All rights reserved.