尝试在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 +H
closures历史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!