理解 bash 中的感叹号 (!)

理解 bash 中的感叹号 (!)

我用了

history | less

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

!22

在命令提示符下,它起作用了——在我当时执行的行上执行命令集。我不知道感叹号用在哪里,它代表 bash 采取的操作是什么,以及在哪里使用它。从文档中我没有看到“有形”的解释。

答案1

!调用历史扩展,该功能最初出现在C壳,早在你可以指望终端有箭头键的日子里。如果您将当前命令编号添加到提示符 ( PS1="\!$ ") 中,这将特别有用,这样您就可以快速查看屏幕以获取过去命令的编号。

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

您可能仍然发现它的一个变体是有用的!!,它重新执行上一个命令。就其本身而言,我没有发现!!Enter比仅更快的命 Enter​​令,但是当组合成更大的命令时它会很有帮助。

例子:普通的飞行员失误sudo基于系统的方法是忘记sudo需要额外权限的命令的前缀。新手重新输入整个命令。勤奋的学生从 shell 的命令历史记录中编辑命令。开明者类型sudo !!

默认情况下,在交互式 shell 中 Bash 中启用这种方式的处理!,并且可以使用set +o histexpand或禁用set +H。您可以在 Zsh 中使用 禁用它set -K

答案2

如果这里没有更长的答案,那么肯定有一个关于超级用户的答案,因为我最近读过一篇。在里面bash 手册页你可以找到一个很大的部分,标题为历史扩展就此事。

您可以执行整个主机的操作,而不仅仅是运行最后一个命令或命令号 X。您可以执行诸如!cat运行以 . 开头的最后一个命令之类的操作cat。或者运行包含但将其替换为的!?bash?:s/bash/csh/最后一个命令。bashcsh

答案3

还可以做更多的事情,!例如:

  • 执行在 3 个命令之前输入的命令:!-3
  • 执行以以下内容开头的命令!ls

还有更多。看您应该了解的 15 个 Linux Bash 历史扩展示例

答案4

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

它是 GNU 历史库的一部分。在 bash 中,它用于重新运行历史记录中的命令。如果你想成为硬核,请在 bash-4.1/lib/readline/histexpand.c 中 grep for History_expansion_char 以获取实现细节。

相关内容