搜索 shell 历史的最佳方式

xen*_*ide 91 shell command-history

有没有比 grep 更好的方法来搜索我的历史文件中的命令?我确实知道命令的开头是什么,但我不知道它在历史上有多远。

更新:以前是特定于 zsh 的,但由于答案重叠,请随时回答此处的任何 shell(或模式 (vi/emacs)),只需注意它是否特定。

Mic*_*zek 84

Ctrl+R通常是最好的方法,正如描述符所说。您还可以使用!string,它运行以string, 或开头的最新命令!?string?,它运行包含string.

(我认为这是与此问题唯一相关的内容,但我在此答案中涵盖了更多历史命令)

  • @xen `<kbd>Ctrl+R</kbd>`。[答案来源](http://unix.stackexchange.com/revisions/8e7e4562-2c1e-4a39-aea7-e10de7eec667/view-source) (14认同)
  • 你如何让'ctrl+r'看起来像那样? (5认同)
  • @OlivierDulac 遗憾的是它没有,这就是我过去格式化密钥的方式;有人[编辑了我的答案](http://unix.stackexchange.com/posts/543/revisions) 稍后将它们分开 (2认同)

小智 33

使用 Bash 时,输入Control-R然后开始输入。打字Control-R输入一些文本后重复输入将使您返回匹配的命令行。


dec*_*tor 18

不确定这是否有帮助,但我喜欢使用ctrl-r然后开始输入命令。它应该遍历您的历史并向您展示第一场比赛。要在比赛之间切换,只需点击ctrl-r再次。

  • 抱歉,忘记了 zsh。您可能需要将此键绑定添加到您的 ~/.zshrc: bindkey '^R' history-incremental-search-backward (2认同)

eph*_*ent 18

如果您将以下内容添加到 ~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward
Run Code Online (Sandbox Code Playgroud)

并重新启动 Bash,您可以开始输入,然后使用Page UpPage Down在以您刚刚输入的相同前缀开头的行的历史记录中前后移动。

(有些人可能更喜欢使用\e[Aand \e[B,这将替换正常的UpandDown操作而不是绑定新键。)


Ada*_*tek 9

已经提到的Ctrl-调用的交互式提示R是最方便的方式。此外,重新映射UpDown箭头键在命令行上搜索当前前缀的历史记录很流行,但这需要~/.inputrc文件进行一些更改

经典且交互性较低的解决方案是使用 shell 历史扩展。打字

!foo
Run Code Online (Sandbox Code Playgroud)

将执行最后一个以fooand开头的命令

!?foo
Run Code Online (Sandbox Code Playgroud)

将执行包含foo. 有关历史扩展的更多信息可以在Bash 参考手册 中找到,假设您的 shell 是 Bash 或兼容的。


Den*_*son 6

如果您添加stty -ixon~/.bashrc文件中,则Ctrl-s将与Ctrl-相反r

  • @imz:`Cq` 将“解冻”。它和“Cs”是常用的软件流控制字符,当使用慢速串行连接时,它们曾经用于手动中断(暂停)输出流。现在,在大多数情况下,输出是如此之快,以至于您在按下“Cs”时想要看到的内容已经滚动过了。`stty -ixon` 关闭软件流控制。 (3认同)

Mei*_*Mei 5

我很惊讶没有提到这一点 - 但是您可以通过执行以下操作在 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 外壳。