我使用了

history | less


来获取先前命令的行,并从左侧的数字中找到了我想重复的行(例如22),并做了

!22


在命令提示符下起作用了,在我当时执行的那一行上执行了命令集。我无法弄清楚在何处使用感叹号,从bash采取的行动来看,感叹号代表什么,在哪里使用。从文档中我看不到“有形”的解释。

评论

这个答案可能会有所帮助

不是您的问题的答案,但是 + R允许您交互式地搜索历史记录,然后在找到所需内容后立即执行。

#1 楼

!是最初出现在C shell中的一项功能,可追溯到您可以依靠终端获得箭头键的日子。如果将当前命令编号添加到提示符(PS1="\!$ ")中,则特别有用,这样您可以快速查看屏幕以获取过去命令的编号。

现在您可以使用箭头键和Ctrl之类的功能了-R搜索命令历史记录,我对该功能没有多大用处。

您可能仍然会发现它的一个变体是!!,它重新执行上一个命令。就其本身而言,我找不到!!输入的速度比↑Enter还要快,但是将其组合成更大的命令时会很有帮助。

示例:在基于sudo的系统上常见的飞行员错误是忘记需要额外特权的命令上的sudo前缀。新手重新输入整个命令。勤奋的学生会从Shell的命令历史记录中编辑命令。开明的一种类型sudo !!

Bash可让您在带有!set +o histexpand的外壳中禁用set +H处理。您可以使用set -K在Zsh中将其禁用。

评论


我发现Ctrl-P Ctrl-J非常快;至少比上输入快。

–短暂
2010-11-5的1:55

如果您只想运行最后一个命令,则Up / Enter很好,但是如果您想以某种方式添加它(例如,您忘记了sudo,则可以执行sudo !!)。这可能比“ Up / Ctrl-A(或Home,如果您足够幸运的话)/ sudo / space / enter”快一些。 YMMV。 :)

– Malvim
2011年1月14日20:57



@AquariusPower:引用一下。要么回声“嗨!”或回声“嗨!”或回声Hi \!。所有人都做同样的事情。

–沃伦·杨(Warren Young)
13年7月18日在16:14

zsh中的setopt NO_BANG_HIST可能比-K更令人难忘。

–格雷戈里
19年6月1日在20:09

对开明的人表示敬意:)不敢相信我一直都是勤奋的学生...

–佩德雷罗
19-10-23在6:07

#2 楼

如果没有更长的答案,这里肯定有超级用户的答案,因为我最近读过一个答案。在bash手册页中,您可以找到关于此事的标题为HISTORY EXPANSION的巨大部分。

您不仅可以运行最后一条命令或命令号X,还可以完成整个主机的工作。 !cat运行以cat开头的最后一个命令。或者!?bash?:s/bash/csh/运行最后一个包含bash的命令,但将其替换为csh

评论


尽管不能直接回答OP的问题,但这需要更多的支持。太有用了!谢谢,哈沃克

– Malvim
15年4月30日在19:09

嗯,在开始谷歌搜索之前,我应该真正查看手册页。

–erikbwork
15年7月27日在13:39

!!:s / bash / csh /实际上运行最后一个命令,然后用csh替换bash(如果存在)。不是最后一个包含bash的命令。那将是!?bash?:s / bash / csh /或!! bash?:s /%/ csh /

–cde
16年1月24日在14:31

广泛使用Bash数年之后,令我震惊的是,我以前从未听说过该关键字,即使我花了数小时浏览手册页,此功能也难以理解。感谢您指出相关部分-这是实际文档中唯一可以充分说明这一点的地方。

–史蒂夫·本纳(Steve Benner)
19年1月30日在9:19

#3 楼

使用!可以完成更多操作,例如:执行在3个命令之前键入的命令:!-3

执行以!ls开头的命令


还有更多。查看15个您应该知道的Linux Bash历史记录扩展示例

评论


对此表示支持。其他答案都没有这些巧妙的技巧。

–卢卡奇(Gergely Lukacsy)
17年2月15日在14:38

由于www.thegeekstuff.com只是一个很棒的资源而受到支持,这是我以前从未见过的少数Linux文章之一。很有帮助。

–史蒂夫·本纳(Steve Benner)
19年1月30日在9:16

这就是我想要的。

– Sridhar Sarnobat
20年1月24日在20:39

#4 楼

当然,您可以执行!!以重用bash shell中的最后一个命令。然后有!$重用上一个命令的最后一部分。

例如查看某些文件

less path/to/your/file.txt


如果现在要编辑同一文件,则可以使用!$仅从上一条命令获取文件路径

vim !$



编辑:

您可以将前一个命令的所有参数与!*

一起使用,例如:这将创建再删除一些文件

$ touch a.txt b.txt c.txt d.txt
$ rm !*


再次,您可以使用上一个命令的特定自变量

例如这将创建4个文件,并将删除第3个文件(c.txt)。

$ touch a.txt b.txt c.txt d.txt
$ rm !:3


同样,您可以从上一条命令中使用一系列参数,如下所示

$ touch a.txt b.txt c.txt d.txt
$ rm !:2-4


这将重用参数2到4,这将对rm b.txt c.txt d.txt的表达式求值

评论


啊,我希望找到这个。两个参数如何工作?

–乔纳森
19年6月6日在16:23

它将仅重用两者的最后一个参数。 $ touch f1 f2然后$ vim!$将评估为$ vim f2

– Teshan Shanuka J
19年6月7日在4:33

还有一种重用参数范围的方法。我不记得确切的语法,但是会这样:!:2-

– Sridhar Sarnobat
20 Jan 24 '20 at 20:40

@SridharSarnobat是的,显然可以。只是做了一个小小的研究,所以它非常有用。我会更新答案

– Teshan Shanuka J
20 Mar 20 '20 at 10:37

#5 楼

我的一个朋友给我发了电子邮件:


它是GNU历史库的一部分。在bash中,它用于重新运行历史记录中的命令。如果您想成为铁杆,请在bash-4.1 / lib / readline / histexpand.c中的
history_expansion_char的grep了解
的实现细节。