Bash 对历史扩展使用感叹号,如该问题的答案中所述(例如sudo !!
,使用 运行上一个命令行sudo
)。但是,我找不到任何地方解释运行以下命令(即单个感叹号)的作用:
!
它似乎没有打印任何内容并以 1 退出,但我不确定它为什么会这样做。我已经在网上和 Bash 手册页中查看过,但除了它是一个“保留字”这一事实外,找不到任何东西——但也是如此}
,并运行以下命令:
}
打印错误:
bash: syntax error near unexpected token `}'
!
命令开头的孤单否定命令或管道的退出状态:如果命令退出0
,它将翻转到1
(失败),如果它退出非零,它将把它变成0
(成功)退出。这种用法记录在 Bash 手册中:
没有后续命令的A否定空命令,它什么都不做
!
并返回 true (相当于command)。因此,它将 true 反转为 false 并以状态 1 退出,但不会产生错误。:
!
在test
and命令中还有其他用途[[
,它们否定条件测试。这些与您所看到的无关。在您的问题和那些情况下,它与历史扩展无关,并且与!
任何其他术语分开。您可以在 bash 手册3.2.2 管道部分中找到记录的单个感叹号
还有第3.2.4.2 节条件构造
还有第4.1 节 Bourne Shell Builtins
还应该注意的是,
!
除非后跟:空格、制表符、行尾、'=' 或'('(当使用内置 shopt 启用 extglob shell 选项时),否则将启动历史记录替换。因为
!
用于比较并且表示NOT。例如:
!
内置命令,反转管道的感觉。其他用途:
#!
内置命令,调用命名解释器来执行脚本。!
事件指示符,将命令行单词标记为历史替换!=
不等式运算符$!
shell 变量,返回最后一个后台命令的进程号。!后跟一个字符串执行以给定字符串开头的最近的先前命令(仍在命令缓冲区中)。也许 shell 刚刚发现前面没有以 <null> 开头的命令。