我可以在bash中搜索历史记录并运行结果吗?

#1 楼

在命令行中输入Ctrl R,然后开始输入上一个命令。结果出现后,请按Ctrl R查看其他匹配项。当出现所需命令时,只需按Enter

。请注意,虽然Ctrl R是默认设置,但如果希望将命令(reverse-search-history)绑定到Ctrl T,则可以使用以下命令进行配置: br />
bind '"\C-t": reverse-search-history'


还有许多其他的readline可绑定命令也可以使用。请看bash手册页。

Bash具有许多功能来搜索和访问交互式命令历史记录。其中最基本的是内置的history。只需键入:

$ history


将打印命令列表以及数字索引,例如:

$ history
1 clear
2 ls -al
3 vim ~/somefile.txt
4 history
$


然后,您可以使用它们的数字索引执行这些命令中的任何一个,只需在索引前面加上一个!即可,如Mitch指出的那样:

$ !1


将执行clear命令。内置的历史记录本身具有许多功能,您可以在bashhistory手册页中找到更多信息。要再次执行!,我们可以执行以下操作:

$ !-2


基本上,这是告诉bash执行您在“两个命令之前”运行的命令。要在历史记录列表中运行上一个命令,我们可以仅使用vim(这是!!的简写形式)。 hayalci显示,您可以指示!-1根据其开头的文本(使用!)或命令本身内的文本(使用bash)执行命令。再次使用上面的示例历史记录列表,如果我们想再次执行!,我们所需要做的就是键入:

$ !cl


然后按Enter。那!?呢?那很简单: >
这将启用历史记录验证,以便不会盲目执行由clearvimshopt指示符匹配的命令,而是在命令行上进行填充,这样您可以确保它们在执行前不会做任何邪恶的事情。 。当您以root用户身份执行命令时,这一点尤为重要。可以在!启动文件中设置此选项,以便在您每次登录时都进行设置。

正如已经指出的那样,可以从!!手册页中收集所有这些信息。对于!,!!和!?指示符,请参阅第9.3节“历史扩展”。

评论


+1我在所有系统上使用Linux已有12年以上。我不知道那个存在。希望我能+10我怎么想念它?

–艾登·贝尔(Aiden Bell)
09年7月17日在19:27

在许多系统上,按向上箭头也可以这样做。

–mas
09年7月17日在20:29

如果有人要合并“!”,“ !!”,“ !?”,“历史记录| grep”和“ ctrl-r”合并成一个完整的答案,我会选择它

–理查德·霍斯金斯(Richard Hoskins)
09年7月19日在14:09

shopt使用的是bashrc,而不是bash_profile(否则,不是登录shell的shell不会启用它)。

–东武
2010-6-29 at 19:35

同样,在按CTRL + R之后,您可以多次使用CTRL + SHIFT + R跳回到上一个命令

– Gal Bracha
15年12月21日在15:55

#2 楼

您也可以这样做:

history | grep "stuff"


它会返回类似

num stuff


,然后您可以键入
/>
!num


评论


!num gnu.org/software/bash/manual/bash.html#Event-Designators的说明

–罗兰先生
20 Mar 12 '13 at 13:25

#3 楼

作为crtl + R的替代方法,您可以键入以下内容来搜索历史记录:

!text


这将在历史记录中搜索以'text'开头的最新命令。

但是我建议您将其放入.bashrc中,以防止执行错误的命令。如!!:s/prev_text/after_text),它将结果行放置到命令提示符下。然后,您可以查看或编辑命令,然后按Enter。

评论


使用!?text重新执行包含(而不是开头)“ text”的最新命令。

– mark4o
09年7月18日在20:36

如果有人要合并“!”,“ !!”,“ !?”,“历史记录| grep”和“ ctrl-r”合并成一个完整的答案,我会选择它。

–理查德·霍斯金斯(Richard Hoskins)
09年7月19日在1:21

#4 楼

我更喜欢使用向后搜索历史记录而不是反向搜索历史记录。前者可以让您键入命令的几个字符,然后按搜索键,而不是先按搜索键然后输入搜索字符串。

在我的系统上,默认情况下,M-p和M-n绑定到相似的功能,但我更喜欢绑定箭头键:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'


#5 楼

我有一个很好的别名,h。它实际上只是“历史记录| grep”,但是我用“ grep -E -v”过滤掉了以前的“ h命令”条目。

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "


使用方式如

h aliases
2003  less .bash_aliases


评论


也可以通过将命令添加到HISTIGNORE来完成。

–tanenbring
17年5月15日在21:52

#6 楼

出色的写作,肖恩!我会对此发表评论,但我有些害羞。 :-)

另一个相关且有用的技术是能够在更改单词时运行先前的命令。假设您键入了目录名称,或者要更改文件名:

$ echo my name is bob
my name is bob
$ ^bob^jordan
echo my name is jordan
my name is jordan


请注意,该命令在运行之前已展开,替换和输出,因此如果运行了错误的命令,您会看到bash认为它在做什么。

#7 楼

由于使用Ctrl-r在历史记录中导航非常麻烦,因此您可能需要考虑hh:

https://github.com/dvorka/hstr

更简单,直接和高效-包括运行命令:



评论


如何使用它?按下哪个键才能看到该图片?

– Nakilon
2015年3月2日在13:53



安装hh后,您可以使用hh命令,也可以按照文档中的说明将其绑定到任何键盘快捷键(通常为Ctrl-r)。

–马丁·德沃夏克(Martin Dvorak)
2015年3月7日在6:38

它现在默认绑定到ctrl + r

– Alleo
17年11月19日在12:42

#8 楼

在bash命令提示符下,键入control-R,然后键入所需命令的几个字符,bash的readline工具将在命令历史记录中搜索该命令。

开始搜索后,您可以再次键入control-R以跳到下一个匹配的命令。

#9 楼

如果您已将外壳配置为使用vi键绑定(set -o viset editing-mode vi中的$HOME/.inputrc),则使用<Esc>/some-command<Return>搜索并按n(下一个)或Shift-n(上一个)以循环浏览命令行历史记录。

评论


这是离vim用户最近的一个。

–加伯·马顿(Gabor Marton)
17年9月9日在13:23

#10 楼

CTRL + R可以正常工作,就像建议的@ John1024一样,但是如果您最近使用的许多命令都相似并且您想要一种快速的方法来扫描所有命令,则它会有些乏味。一种替代方法是使用history

$ history | grep keyword


#11 楼

我喜欢HSTR,但有时似乎无法安装它。
所以我使用fzf编写了一个别名来模仿其行为(hx,用于“历史执行”)
alias hx='eval $(history | sed "s/^ *[0-9]* *//g" | fzf --tac --tiebreak=index --height=10)'



history:好吧,获取历史记录

sed:从列表中删除数字列(POSIX)

fzf:这是魔术,允许您对列表进行交互式模糊搜索,或者使用C-JC-K移动,然后使用Enter执行命令。

--height:设置显示的行数。

--tac :还原列表(对于历史记录更合逻辑)

--tiebreak=index:在fzf更新结果时保留历史记录顺序