回声“#!”失败 - “未找到事件”

时间:2012-08-05 11:45:45

标签: bash echo ubuntu-12.04

以下失败,我不明白为什么:

$ echo "#!"

以下错误消息也会失败:

$ echo "\#!"

错误消息:

-bash: !": event not found

为什么会失败?如何改为echo

5 个答案:

答案 0 :(得分:13)

!字符用于csh - 样式历史记录扩展。

如果您不使用此功能,set +o histexpand(又名set +H)会关闭此行为。它已关闭脚本,但通常启用交互式使用。

作为一种解决方法,您可以使用单引号而不是双引号 - 当然,请记住它们的不同语义。例如,如果需要将引用与变量插值相结合,则可以更改

echo "#!$SHELL"  # oops, history expansion breaks this

 echo '#!'"$SHELL"

(注意相邻的单引号和双引号字符串;在shell完成之后,引号将被删除,字符串#!将输出到变量值{{1}旁边它们之间没有空格)或许多其他常见的解决方法,如

SHELL

答案 1 :(得分:9)

默认情况下,bash支持csh兼容的历史记录扩展。

在bash中

echo #!

只会打印换行符,因为#会发表评论。

echo "#!"

#是以"开头的字符串的一部分。对于特殊字符,bash仍会检查此类字符串。 !是一个特殊字符,如果后跟任何其他文字。

-bash: !": event not found

在这种情况下,bash期望!"标记引用以"开头的shell历史记录中的上一个命令,但没有找到。所有这些,!都不会触发此行为:

$ echo \# !
# !

$ echo fee ! fie
fee ! fie

最后,

$ echo !echo

生成两行,第一行由shell打印,以显示上面的模式如何扩展为:

echo echo '# !'

而第二行只是执行扩展命令的结果:     echo#!


另请参阅:Bash man page上的History Expansion

答案 2 :(得分:4)

echo '#!'

基本上,使用双引号(")又称“弱引用”,Bash使用字符串做一些古怪的事情,比如变量替换。使用单个(')又名“强引号”字符串就是字面意思。

参见例如here有关引用的更深入解释。

答案 3 :(得分:4)

另一种解决方法可能是在“!”之后增加一个空格。 :

# echo "#! "
#!

答案 4 :(得分:2)

在我的情况下,所有命令都有效。也许你可以指定你的环境。

$ echo "\#\!"
\#\!
$ echo "#!"
echo "#"
#
$ echo "#!"
echo "#"
#
$ echo $BASH_VERSION
3.2.48(1)-release