如何在BASH中循环进行反向搜索?


443

在终端中,我可以键入CTRL-R以搜索先前在BASH中键入的匹配命令。例如,如果我键入,CTRL-Rgrep列出我的最后一个grep命令,然后按Enter键即可使用它。但是,这仅给出一个建议。有没有办法循环浏览其他先前键入的匹配命令?

Answers:


596

如果我正确地理解了这个问题,您应该可以通过反复敲击来循环进行选择Ctrl+R

例如:

Ctrl+R grep Ctrl+R Ctrl+R ...

这会向后搜索您的历史记录。要改为向前搜索,请使用Ctrl+S,但您可能需要先设置:(stty -ixon通过.bash_profile手动设置)或:来禁用XON / XOFF功能(该功能将取代)Ctrl+s。(更多详细信息在这里。)


23
+1-仅供参考-您也可以根据此StackOverflow答案进行向前搜索。
Jordan Arseno

7
如果碰巧经过,请使用Ctrl + Shift + r进行反向滚动。
威斯威特2015年

19
@wiswit CTRL+SHIFT+r对我不起作用。
Maxim Suslov

9
@MaximSuslov看到这个问题:stackoverflow.com/questions/791765/…您可以将其添加[[ $- == *i* ]] && stty -ixon到.bashrc中,然后CTRL+sCTRL+r
与之

9
@JordanArseno我将“向前搜索”的意思是“搜索我尚未键入的命令”
Josh Johnson

234

如果您觉得该命令会经常使用,则可以添加一个标签

命令#有用

然后

ctrl+r #useful

之所以有效,#是因为它是注释定界符,即,符号后的所有内容都不会解释为命令。但是,它将被记录在历史记录中,因此可以搜索。


5
通常我喜欢这种标记。#trg_bld #open_log
Makesh

1
在哪里添加此标签?
Sudip Bhandari

5
@SudipBhandari在您的命令之后。#开始评论。例如ls -lah #useful
Andrei

47

您还可以通过将以下行添加到〜/ .inputrc来设置向上和向下箭头以进行稍微不同的搜索:

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

而不是在命令中的任何地方搜索子字符串(例如Ctrl-r),而是将搜索从光标左侧的文本开始的命令。例如,如果我运行以下命令:

$ ls bart
$ ls fools

然后键入ls并按Up两次,它将显示ls bart和光标在同一位置。与Ctrl- 进行比较r,它将ls在最后一行找到两次,因此您必须再次按一次才能找到前一行。

这些方法都有其优势,并且都可以节省大量时间。


2
这在OS X上也是标准的,因此您无需创建~/.inputrc和添加这两行。
DASKAjA

1
正如falconepi在此答案的评论中所写,在Ubuntu上,您只需要在~/.inputrc两行中取消注释,包括history-search- *
Arpad Horvath

您也可以查看此帖子以获取有关此答案的更多详细信息:codeinthehole.com/writing/…–
Andrei

这在我的macOS(10.13)上不是标准的。我一直都错过了此功能!

一件好事是,您仍然可以使用ctrl-p / ctrl-n定期浏览历史记录
elig

0

有一个内置的替代Ctrl + R名为hstr。它允许同时(除其他外)搜索与所有搜索标记匹配的命令历史记录,并使用箭头键循环显示结果:

例

这是一个演示截屏

可以将其安装在Debian系列操作系统上,例如:

add-apt-repository ppa:ultradvorka/ppa
apt-get update
apt-get install hstr

hstr --show-configuration >> ~/.bashrc

然后使用Ctrl + R(重新打开终端后)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.