history | less
来获取先前命令的行,并从左侧的数字中找到了我想重复的行(例如22),并做了
!22
在命令提示符下起作用了,在我当时执行的那一行上执行了命令集。我无法弄清楚在何处使用感叹号,从bash采取的行动来看,感叹号代表什么,在哪里使用。从文档中我看不到“有形”的解释。
#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了解
的实现细节。
评论
这个答案可能会有所帮助不是您的问题的答案,但是