it-swarm.cn

了解bash中的感叹号(!)

我用了

history | less

为了获得先前命令的行,并从左侧的数字中发现我想重复的行(例如22),并做了

!22

在命令提示符处工作,并且有效-在我当时执行的那一行上执行命令集。我无法弄清楚在何处使用感叹号,就bash采取的操作而言,感叹号代表什么,以及在哪里使用。从文档中,我看不到“有形的”解释。

112
Vass

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

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

您可能仍然发现它有用的一种变体是!!,它会重新执行上一个命令。我自己找不到 !!Enter 比任何更快 Enter,但将其组合成较大的命令时可能会有所帮助。

示例:基于 Sudo ]的常见 pilot error 需要额外特权的命令上的Sudo前缀。新手重新输入整个命令。勤奋的学生从命令行管理程序的历史记录中编辑命令。开明的一种是Sudo !!

Bash允许您使用!set +o histexpand在Shell中禁用set +H处理。您可以使用set -K在Zsh中将其禁用。

157
Warren Young

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

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

52
Cry Havok

!可以做很多事情,例如:

  • 执行在3个命令之前键入的命令:!-3
  • 执行以!ls开头的命令

还有更多。请参阅 您应该知道的15个Linux Bash历史扩展示例

40
user379997

当然你可以做!!重用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

6
Teshan Shanuka J

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

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

4
Vass