搜索带有我刚刚输入的前缀的上一个命令


66

我们可以使用向上和向下箭头在命令历史记录中导航。

在某些IDE(例如Matlab)中,如果我们输入一些内容然后按箭头键,则仅在以输入内容开头的历史记录命令之间滚动。那真的很方便,但是在Shell终端中,这是行不通的。

有什么方法可以在Shell终端中获得类似的功能?还有其他提高终端使用效率的技巧吗?


您可以简单地使用提供这种功能的外壳,例如fish;)
yoann

@yoann你以为bash不会。默认情况下,它不会通过readline进行访问。
muru

@muru我知道bash中的CTRL + R,egmont的答案提供了一种使用Page Up / Page Down的巧妙方法。但是,有没有一种方法可以使用箭头键呢?
yoann 2015年

1
@yoann请查看unix.stackexchange.com/a/76591/70524。代替\e[5~\e[6~使用\e[A\e[B
muru 2015年

Answers:


94

您正在寻找的是CtrlR

键入CtrlR,然后键入所需命令的一部分。Bash将显示第一个匹配的命令。继续输入CtrlR,bash将循环显示先前的匹配命令。

要在历史记录中向后搜索,请键入CtrlS。(如果CtrlS对您不起作用,那可能意味着您需要禁用XON / XOFF流控制:为此,请运行stty -ixon。)

记录在中的“搜索”下man bash


1
Ctrl-Q退出冻结状态(如果您已经先击中Ctrl-S而不先关闭流量控制并冻结了终端)。
朱洪波

26

将它们放在您的~/.inputrc

"\e[5~": history-search-backward
"\e[6~": history-search-forward

这些使得Page UpPage Down行为,如你所愿。(有些发行版已经为您配置了它。)我个人觉得这些方法比Ctrl+ R或更加方便history


这是所有当前答案中最方便的方法。您能否对工作机制做些解释?

3
~/.inputrc/etc/inputrc环境变量引用的$INPUTRC文件是使用readline的所有应用程序的行编辑配置文件,包括bash(您的shell)。它具有某些内置的行编辑功能,包括以下两项:在bash的手册页中搜索这些关键字之一以了解更多信息。\e[5~/ \e[6~是大多数终端仿真器中的Page Up / Down键生成的转义序列;要查看它,请启动cat命令,然后按以下键(转义字节在终端中表示为^[,在inputrc中表示为\e)。
egmont

您原始问题中的示例说,在Matlab中,向上/向下键以这种方式工作。如果将up和Down序列放在inputrc中并分配给该动作,将会发生什么会很有趣。它会正常工作,还是会产生讨厌的副作用,因为它与默认行为冲突。我不知道,如果您对此进行尝试,我很高兴听到您的发现。
egmont

当我这样做时,echo $INPUTRC它是空的。我正在使用Ubuntu 14.04
JorgeeFG

2
我个人比较喜欢重写向上和向下箭头做到这一点:"\e[A": history-search-backward"\e[B": history-search-forward
A.Wan

9

除了^ r / ^ s的历史记录i-search:

alt.在光标处插入上一个命令的最后一个“单词”。重复此操作以从较旧的命令中获取最后的单词。(但是请注意,结尾&命令是背景命令的最后一个字)。

这是超级方便mkdir foocdALT点。甚至比向上箭头^ a,alt-d(删除前向单词)快cd

要获得倒数第二个单词,请使用esc - 2 alt+.(即,使用emacs样式的数字参数作为alt+.。负数从头算起,正数从头开始算起。)在某些时候,鼠标和复制/粘贴或向上箭头和^ w / ^ y部分的到达速度更快(请参见下文)。


如果您的终端设置正确/正确,则ctrl-left和ctrl-right将按单词向后/向前移动。如果不是这样,希望至少alt-b和alt-f会做同样的事情。


ctrl- /是撤消操作。如果您可以在有点超调的情况下撤消操作,则可以使用自动重复功能更有效地删除单词。


使用kill-ring更有效地混合/匹配命令,就像在Emacs中一样。ctrl-y粘贴最后一个ctrl-w / ctrl-u / ctrl-backspace / alt-d。alt-y循环显示较旧的被杀死的文本。

多个ctrl-w或连续执行的任何操作都会在kill-ring条目上输入。如果要删除两件事并且以后只粘贴一件事,请使用向左和向右箭头或其他方式将条目分开。

将所有这些结合在一起,您可以

  • 开始输入命令
  • ctrl -r返回到旧命令,并使用control-w或类似命令获取部分命令。
  • esc -r或alt+r将其还原到删除部分之前的状态。
  • alt- >返回历史记录的末尾(即一直向下箭头),返回到您位于中间的命令。

其他交互式使用技巧:

启用shopt -s globstar,您就可以这样做**/*.c(递归包括当前目录)。有时便于交互使用,但通常find -name '*.c' -exec foo {} +更好。

如果您编写bash脚本,那么shopt -s extglob在交互式shell中启用它也会很方便。有时,您会发现某些用途,例如*.!(c|h)匹配不以.c或.h结尾的文件。

找到你喜欢的别名ls -lless和其他任何你做了很多。(cp -imv -irm -I很好。不要养成依靠他们来做选择性rm 的习惯。GNUrm的-我要对所有的arg一次询问。)

我喜欢alias m=less(表示“更多”)。我已经less设置,.绑定到上一个/下一个文件(lesskey)。默认值为多按键序列,不能与自动重复一起使用。


我喜欢在GNU屏幕内做所有事情。与Konsole(或我尝试过的任何其他终端模拟器)中的一系列选项卡相比,我发现跟踪编号的屏幕窗口更容易。如果您还不了解screen,请学习tmux,因为它是新的并且不那么笨拙。

为了获得类似的功能,即使用与另一个外壳相同的cwd打开一个新外壳,我对cd / pushd / popdcds 8使用了一个自定义钩子,使我可以将cd切换到屏幕窗口8中我的外壳正在使用的任何目录。 即使只有一个屏幕会话,此方法也适用于屏幕会话之外的外壳。


我的似乎没有被“正确配置”。我在这里看到的许多快捷方式都不起作用,我使用的是来自Ubuntu 14.04的常规终端。我该如何配置?
JorgeeFG

@JorgeeFG:我认为gnome-terminal在我切换到KDE之前,它对于Ubuntu 14.04 来说是开箱即用的。相关选项在您的终端设置中,包括esc-prefix和high-bit以及其他一些设置。其中有些不能通过ssh对我完美地工作。(例如ctrl向左/向右移动箭头键的转义码,我从5D字面上出现)
Peter Cordes

7

将以下行添加到您的 ~/.inputrc

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

这类似于egmont的答案,但不是使用向上翻页和向下翻页,而是使用向上箭头和向下箭头的转义序列。这种方式在Mac上使用更加方便。


4

我总是倾向于使用较大的HISTSIZE值来配置我的机器,以便保留更长的历史记录列表,并使用时间戳值来保留HISTTIMEFORMAT,以便可以看到命令何时运行。

export HISTSIZE=10000
export HISTTIMEFORMAT="%m/%d/%Y %T "

3

我通常使用的方法是将history命令与grep

IE浏览器:

history | grep <command im looking for>

这将显示您键入的包含该命令的命令的编号历史记录,然后可以使用:

!<number listed in history command>

重做该命令。

IE浏览器:

history | grep history

142  history
143  history | grep lvresize
568  history | grep echo
570  history | grep echo
571  history | grep history

其次是: !571

将重复 history | grep history


1
CR =更好+更安全
PSkocik

1
也许,就我个人而言,我发现传送给grep的历史记录是查找大多数命令的一种较快的方法。至于“更安全”,我不确定您的意思,使用历史记录和通过cR搜索历史记录时固有的风险是什么?
重力2015年

2
@Gravy我怀疑PSkocik意味着!历史记录替换不太安全。
derobert

3
@Gravy固有的风险可能是意外地弄错了路线。除非您使用Control-S并且启用了xon / xoff流控制(通常是默认设置),否则不知道您的终端为何会死机。如果是这样,Control-Q将把它带回来。
derobert

1
我同意@PSkocik,CR是很多更好,因为它更容易修改历史系,而不是仅仅运行它再次以同样的方式。再次运行exact-same命令很简单,可以节省复杂的单行代码重新键入变体的时间,或者在较长的路径中用制表符补全另一个文件。看我的答案。
彼得·科德斯

1

我每天在bash终端中使用4个技巧(以及其他一些技巧

  • 执行最后一个命令: !!

  • 从历史记录中执行命令N !N

  • 从历史记录的前缀 开始打印最后一个命令 !prefix:p

  • 从历史记录的前缀 开始执行最后一个命令 !prefix


1

如果可以使用zsh而不是bash使用cona,请使用oh-my-zsh

它包含在命令历史记录中的上下箭头导航。当您已经键入文本(如Mathlab)时,它还允许相同的导航。

编辑:它还包含其他以开发人员为中心的内容,例如别名和主题。这些额外功能使发行版更大,使用更复杂。

https://github.com/robbyrussell/oh-my-zsh


1
oh-my-zsh包含大量的东西。您可能会说:当您仅需要特定的设置或应用程序时,该发行版中便包含此确切功能。
muru

我编辑了这篇文章:我警告说它比一个简单的应用程序还要大。
user9869932 2015年

1

将以下别名添加到〜/ .bashrc

alias h='history | awk '"'"'{$1="";print}'"'"' |sed "s/^ *//" |grep -v "^h " | sort | uniq | grep'

用法:h fire将为我提供包含fire的命令列表。否则h ^fire我会得到以开头的命令列表。

当我想同时查看一系列命令时,这很有用。

顺便说一句,这'"'"'很丑陋,但我找不到其他方法来避免在单引号中使用单引号。


费- h="history | awk '{\$1=\"\"; print}'应该工作。或者创建一个函数并调用它。
DarkHeart,2016年

谢谢DarkHeart,但我尝试了您的代码,发现在我的环境中无法正常工作,也许我的工作中有所不同
Hosi Golden
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.