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

尝试在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事件”? 我从来没有听过这个概念。 另外,我应该如何输出“!” 在句子结尾?

    ! bash是一个特殊的字符,它被用来指以前的命令; 例如,

     !rm 

    将回顾并执行以string“rm”开头的最后一个命令

     !rm:p 

    将会记得但不执行以string“rm”开头的最后一个命令。 bash正在解释echo "reboot your instance!"的感叹号echo "reboot your instance!" 作为“ 在这里用紧接在感叹号之后的字符开始的最后一个命令replace ”,并且抱怨你无法在你的历史中find一个以单引号开头的事件(命令)。

    尝试

     echo reboot your instance\! 

    从bash保护(逃脱)感叹号。

    您可以使用set +Hclosures历史loggingreplace。

    要解决您的原始问题,请尝试使用单引号,而不是双引号。 对于后者,bash将在将结果传递给命令之前尝试扩展某些字符(本例中为echo)。 用单引号,bash传递整个string,不变。

    ! 在命令中用于引用命令行历史logging。 请参阅: http : //tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS 。 在上面的例子中,bash试图扩展!"作为echo之前的一个事件的引用,因此错误。

    请注意,在脚本中, 所有的历史命令都是禁用的,因为它们只在交互式shell中才有意义。

    我唯一使用的是!$ 它扩展到上一个命令的最后一个参数。 这是一个有用的速记地点。

    只是把一个空间之间! 和“比它会工作。

    干杯。

    是的! 是一个特殊的字符,它被用来指以前的命令。

    很less有办法可以处理这种情况

    以下将输出string,因为它是

     echo 'Reboot your instance!' 

    以下将执行命令并连接string

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

    bash 4.3 ,似乎你不再需要使用单引号或set +H

     $ bash --version GNU bash, version 4.3.46(1)-release (x86_64-unknown-linux-gnu) [...] $ echo "Reboot your instance!" Reboot your instance!