xen*_*ide 91 shell command-history
有没有比 grep 更好的方法来搜索我的历史文件中的命令?我确实知道命令的开头是什么,但我不知道它在历史上有多远。
更新:以前是特定于 zsh 的,但由于答案重叠,请随时回答此处的任何 shell(或模式 (vi/emacs)),只需注意它是否特定。
Mic*_*zek 84
Ctrl+R通常是最好的方法,正如描述符所说。您还可以使用!string
,它运行以string
, 或开头的最新命令!?string?
,它运行包含string
.
(我认为这是与此问题唯一相关的内容,但我在此答案中涵盖了更多历史命令)
dec*_*tor 18
不确定这是否有帮助,但我喜欢使用ctrl-r然后开始输入命令。它应该遍历您的历史并向您展示第一场比赛。要在比赛之间切换,只需点击ctrl-r再次。
eph*_*ent 18
如果您将以下内容添加到 ~/.inputrc
"\e[5~": history-search-backward
"\e[6~": history-search-forward
Run Code Online (Sandbox Code Playgroud)
并重新启动 Bash,您可以开始输入,然后使用Page Up和Page Down在以您刚刚输入的相同前缀开头的行的历史记录中前后移动。
(有些人可能更喜欢使用\e[A
and \e[B
,这将替换正常的UpandDown操作而不是绑定新键。)
已经提到的Ctrl-调用的交互式提示R是最方便的方式。此外,重新映射Up和Down箭头键在命令行上搜索当前前缀的历史记录很流行,但这需要对~/.inputrc
文件进行一些更改。
经典且交互性较低的解决方案是使用 shell 历史扩展。打字
!foo
Run Code Online (Sandbox Code Playgroud)
将执行最后一个以foo
and开头的命令
!?foo
Run Code Online (Sandbox Code Playgroud)
将执行包含foo
. 有关历史扩展的更多信息可以在Bash 参考手册 中找到,假设您的 shell 是 Bash 或兼容的。
如果您添加stty -ixon
到~/.bashrc
文件中,则Ctrl-s将与Ctrl-相反r。
我很惊讶没有提到这一点 - 但是您可以通过执行以下操作在 bash 或 ksh 中选择 vi 模式:
set -o vi
Run Code Online (Sandbox Code Playgroud)
...或将其用作~/.inputrc
(对于 bash 等程序中使用的 GNU readline)的内容:
set editing-mode vi
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用Esc进入命令模式并使用k回到历史,并j前进。您也可以使用/正常?搜索和反向搜索进行搜索。
如果您使用~/.inputrc
,那么这不仅适用于 GNU bash,而且适用于使用 GNU readline 的任何东西,例如 CLISP 以及可能的程序,例如 MySQL 命令外壳和 CPAN 外壳。