什么是“-bash:!”:未找到事件”

什么是“-bash:!”:未找到事件”

尝试在 bash shell 下执行以下操作echo "Reboot your instance!"

在我的安装中:

root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found

有人能解释一下什么是“bash 事件”吗?我以前从未听说过这个概念。另外,我应该如何在句子末尾输出“!”?

答案1

您可以使用 关闭历史记录替换set +H

答案2

!是 bash 中的特殊字符,用于引用前面的命令;例如,

!rm

将调用并执行最后一个以字符串“rm”开头的命令,并且

!rm:p

将调用但不执行以字符串“rm”开头的最后一个命令。bash 将感叹号解释为echo "reboot your instance!"在此处替换以感叹号后面的字符开头的最后一个命令“,并抱怨它无法在您的历史记录中找到以单个双引号开头的事件(命令)。

尝试

echo reboot your instance\!

保护(转义)感叹号免受 bash 的攻击。

答案3

要解决原始问题,请尝试使用单引号,而不是双引号。使用后者时,bash 会在将结果传递给命令(在本例中为 echo)之前尝试扩展某些字符。使用单引号时,bash 会传递整个字符串,不做任何更改。

!在命令中用于引用命令行历史记录。请参阅:http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS以获得完整的集合。在上面的例子中,bash 试图!"在 echo 得到查看之前将其扩展为对事件的引用,因此出现错误。

请注意,在脚本中,全部历史命令被禁用,因为它们仅在交互式 shell 中才有意义。

我唯一经常使用的命令是!$。它扩展为上一个命令的最后一个参数。在某些地方,这是一种有用的简写。

答案4

是的,!是 bash 的特殊字符,它用于引用前面的命令。

处理这种情况的几种方法

下面将按原样输出字符串

echo 'Reboot your instance!'

下面将执行命令并连接字符串

echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`

相关内容