从bash历史记录中选择命令


20

按下向上按钮很乏味,我可能会错过寻找的命令。因此,history在终端上键入内容时,会给我我之前输入的所有命令,并已索引成一个数字。有什么办法我可以拨打与该命令关联的数字吗?


现在还有更多互动选项吗?这些都是容易出错的
马特

Answers:


31

bash的历史可以做很多有用的事情,Strg-r其中Terry Wang提到的搜索是其中一项重要的工作。但是也可以完全按照您的要求进行。

您可以使用重新执行上一个命令!!。这样,您还可以编辑上一个命令。例如,如果您忘记获得命令的root用户特权

apt-get install a-long-list-of-packages

您无需再次输入所有内容。而是打电话

sudo !!

如果要从历史记录中的特定位置重新执行命令,也可以使用!,例如

!3

在位置3重新执行该命令。请注意,这从顶部开始计算。因此,如果您要在历史记录中存储500个命令,!1则将是“ 500个命令之前”。您也可以使用负数。例如

!-2

将重新执行倒数第二个命令。

您还可以重新执行以类似字符串的开头的最后一条命令

!apt-

这将重新执行以“ apt-”开头的最后一行。如果您希望最后一个命令在字符串出现在行中的任何位置,则可以使用类似

!?pt-ge

bash历史可以做的事情还有更多有趣的事情。只是为了给人一种广泛的印象,您可以从历史记录中专门访问命令的参数。所以

!-5:3:p

从最后一个命令将第三个参数打印到第五个参数。

编辑:关于下面的Rudie的评论,使用此bash历史扩展的标准设置确实可以直接执行。这最好是这样描述的:像调用!-3替换由外壳,从历史上的倒数第三个命令,然后执行您的输入(与更换)。因此,如果您键入!-3并按,ENTER而最后一个命令是ls ~,则实际上与您ls ~再次键入并按ENTER“自己” 按相同。

如果您不想这样做,可以设置shell选项histverify。对于设置和取消设置外壳程序选项,您可能需要阅读该shopt命令。使用histverifyset时,类似的调用!-3只会将历史记录中的替换内容写入命令行,而不会直接执行。为了让自己有所作为,请按一下关键点ENTER-或选择不要这么做。


所以这!是非常危险的……我想!-4在运行它之前先确切地知道做了什么。还是先显示给您?很酷的总结!
Rudie 2014年

1
@Rudie很好,我更新了答案。历史记录功能主要是为了加快工作速度并节省击键次数。因此是一个标准的“您真的,真的是那个意思吗?” 至少会部分挫败这一目标。即使可以,通常也不会调用像这样的“后退”命令!-238。记住您的倒数第二个,倒数第三个,也许是倒数第二个命令并不难;)与Linux一样(实际上,一般而言,对于计算而言),人们通常希望您知道自己在做什么。而且,如果您真的想要额外的安全网,那已经是一件容易的事shopt了;)
Henning Kockerbeck 2014年

16

就在这里。例如,如果要执行旁边带有数字1234的命令,请执行以下操作:

!1234

其他有用的东西:

  • 如果要运行最后运行的命令,请执行以下操作:

    !!
  • 如果要运行最后一个 ls命令,请执行以下操作:

    !ls
  • 如果你跑了 ls /some/long/path,并且想cd要这样做,请执行以下操作:

    cd !$

了解更多信息:



3

如果您找到了命令的历史编号,并且想要再次执行它,请键入!其后跟数字,例如!1234,然后按Enter。这是历史扩展的一部分; 您可以在其上添加修改器。

如果要在运行命令之前对其进行编辑,请fc 1234调用外部编辑器。

但是正如特里·王(Terry Wang)所述,在历史记录中查找命令通常比确定其历史记录编号更快,包括Ctrl+ R调用增量搜索(Enter在找到要执行的命令时按)或fc PREFIX执行上一个命令。以PREFIX。开头的命令。


1

history命令将显示所有命令及其相关编号。如果您只想在执行135号命令行之前进行快速检查,则可以键入:

echo !135

这将向您显示将要执行的操作。

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.