如何搜索 bash 历史记录并重新运行命令?

Ric*_*ins 347 unix bash

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

小智 498

键入Ctrl R的命令行并开始输入一条命令。一旦出现结果Ctrl R,请继续点击以查看其他比赛。当您想要的命令出现时,只需按Enter

请注意, whileCtrl R是默认设置,如果您希望将命令 ( reverse-search-history) 绑定到Ctrl T您可以使用以下内容进行配置:

绑定 '"\Ct": 反向搜索历史'

您还可以使用大量其他 readline 可绑定命令。看看bash手册页

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

$历史

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

$历史
1 清除
2 ls -al
3 vim ~/somefile.txt
4 历史
$

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

$ !1

将执行clear命令。内置的历史记录本身有很多特性,你可以在bashhistory手册页中看到更多。

您还可以在使用!指示符时指定相对负偏移量,因此使用上面的历史列表,如果我们想vim再次执行,我们可以这样做:

$ !-2

这基本上是告诉 bash 执行您“两个命令前”运行的命令。要运行历史列表中的上一个命令,我们可以使用!!(这只是 的简写!-1)。

!标志不限制你数值指定要运行的命令。hayalci表明您可以bash根据命令开头的文本(使用!)或命令本身内的文本(使用)指示执行命令!?。同样,使用上面的示例历史列表,如果我们想clear再次执行,我们需要做的就是输入:

$ !cl

并按Enter。那么vim呢?这很简单:

$ !?一些

hayalci回应中最重要的一点是对shopt内置函数的调用:

$ shopt -s histverify

这将使历史验证,以便通过匹配该命令!!!以及!?代号并不是盲目地执行,而是填充在命令行上,这样可以保证他们在执行之前不做坏事。当您以 root 用户身份执行命令时,这一点更为重要。此选项可以在您的.bashrc启动文件中设置,以便在您登录时设置。

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

  • +1 我在所有系统上使用 Linux 已经超过 12 年了。我不知道那存在。希望我能+10 *我怎么错过了??* (44认同)
  • 同样在按下 CTRL+R 后,您可以多次使用 CTRL+SHIFT+R 跳回上一个命令 (2认同)

Mit*_*tch 50

你也可以这样做:

history | grep "stuff"
Run Code Online (Sandbox Code Playgroud)

它会返回类似的东西

num stuff
Run Code Online (Sandbox Code Playgroud)

然后你可以输入

!num
Run Code Online (Sandbox Code Playgroud)


hay*_*lci 39

作为替代crtl+R,您可以通过键入来搜索历史记录

!text
Run Code Online (Sandbox Code Playgroud)

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

但我建议你把它放在你的 .bashrc 中以防止执行错误的命令。

shopt -s histverify
Run Code Online (Sandbox Code Playgroud)

这会指示 bash 在任何历史操作(如!!:s/prev_text/after_text)之后,将结果行放置到命令提示符中。然后您可以查看或编辑命令,然后按 Enter。

  • 使用 !?text 重新执行包含(而不是开头)“text”的最新命令。 (5认同)
  • 如果有人要合并 '!', '!!', '!?', 'history | grep' 和 'ctrl-r' 成为一个全面的答案,我会选择它。 (3认同)

小智 18

我更喜欢使用 history-search-backward 而不是 reverse-search-history。前者让您键入命令的几个字符然后按搜索键,而不是先按搜索键然后键入搜索字符串。

默认情况下,在我的系统上, Mp 和 Mn 绑定到类似的功能,但我更喜欢绑定箭头键:

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
Run Code Online (Sandbox Code Playgroud)


小智 13

写得很好,肖恩!我会把它放在评论中,但我有点害羞。:-)

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

$ echo 我的名字是鲍勃
我的名字是鲍勃
$ ^鲍勃^乔丹
回声我的名字是乔丹
我叫乔丹

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


小智 13

我有一个非常棒的别名,h。这真的只是“历史| grep”,但我用“grep -E -v”过滤掉了以前的“h命令”条目

alias h="history | grep -E -v '^ *[0-9]+ *h ' | grep "
Run Code Online (Sandbox Code Playgroud)

用过

h aliases
2003  less .bash_aliases
Run Code Online (Sandbox Code Playgroud)


Mar*_*rak 7

由于使用 Ctrl-r 浏览历史记录在 IMO 中很麻烦,您可能需要考虑hh

https://github.com/dvorka/hstr

这使得导航变得更加简单、直接和高效——包括运行以下命令:

在此处输入图片说明

  • 安装 hh 后,您可以使用 hh 命令或将其绑定到任何键盘快捷键(通常是 Ctrl-r),如文档中所述。 (2认同)