2009-07-17 19:23:49 +0000 2009-07-17 19:23:49 +0000
302
302

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

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

答案 (10)

38
38
38
2009-07-17 20:40:32 +0000

作为crtl+R的替代方法,你可以通过输入

!text

来搜索历史记录,这将会搜索最近的以'text'开头的命令。

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

shopt -s histverify

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

33
33
33
2009-07-17 20:21:39 +0000

你也可以这样做:

history | grep "stuff"

它会返回类似

num stuff

然后你可以输入

!num
``` 。
16
16
16
2011-02-02 20:32:12 +0000

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

在我的系统中,默认情况下,M-p和M-n绑定了类似的功能,但我更喜欢绑定方向键。

bind '"\e[A":history-search-backward'
bind '"\e[B":history-search-forward'
13
13
13
2014-09-25 16:45:14 +0000

我有一个非常棒的别名,h,其实就是 “历史|grep",但我用 "grep -E -v ”

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

用来过滤掉以前的 “h命令 "条目,就像

h aliases
2003 less .bash_aliases
```一样。
12
12
12
2009-09-10 14:23:48 +0000

优秀的写法,肖恩! 我本想把这个放在评论里,但我害羞了几分声誉。 :-)

还有一个相关的、有用的技术,就是可以在改字的同时运行以前的命令。比如说你打错了目录名,或者想改文件名:

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

注意,在命令运行之前,命令会被展开、替换和输出,所以如果运行错误的命令,你可以看到bash以为它在做什么。

6
6
6
2014-12-18 16:37:14 +0000

由于使用Ctrl-r在历史记录中导航很麻烦,你可以考虑hhhttps://github.com/dvorka/hstr

这使得导航更加简单、直接和高效–包括运行命令。

4
4
4
2014-09-04 04:55:04 +0000

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

当你开始搜索后,你可以再次输入control-R来跳转到下一个匹配的命令。

3
3
3
2015-11-22 15:21:56 +0000

如果你的shell配置为使用vi键绑定(set -o vi或在set editing-mode vi中有$HOME/.inputrc),那么你用<Esc>/some-command<Return>进行搜索,并点击n(下一个)或Shift-n(上一个)来循环浏览命令行历史。

2
2
2
2014-09-04 05:11:10 +0000

像 @John1024 建议的那样,CTRL+R 工作得很好,但如果你最近的许多命令都是类似的,而你又想快速扫描它们,那就有点乏味了。另一种方法是使用 history :

$ history | grep keyword
0
0
0
2019-05-22 13:17:52 +0000

我喜欢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 更新结果时,保持历史记录顺序。