我用了
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/
最后一个命令。bash
csh
答案3
答案4
我的一个朋友给我发了这样的电子邮件:
它是 GNU 历史库的一部分。在 bash 中,它用于重新运行历史记录中的命令。如果你想成为硬核,请在 bash-4.1/lib/readline/histexpand.c 中 grep for History_expansion_char 以获取实现细节。