回声“#!”失败 – “未find事件”

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

$ echo "#!" 

以下也失败,同样的错误信息:

 $ echo "\#!" 

错误消息:

 -bash: !": event not found 

为什么会失败? 应该怎么做echo呢?

! 字符用于csh风格的历史扩展。

如果您不使用此function,请set +o histexpand (又名set +H )closures此行为。 它closures了脚本,但通常启用交互式使用。

作为一个解决方法,你可以使用单引号而不是双引号 – 记住coure,它们的不同的语义。 例如,如果需要将引用与variables插值相结合,则可以更改

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

  echo '#!'"$SHELL" 

(注意相邻的单引号和双引号的string; shell完成后,引号将被删除,并且string#!将被输出到variablesSHELL的值旁边,它们之间没有空格)或者其他常见的解决方法的数量

  printf '#!%s\n' "$SHELL" 

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

在bash中

 echo #! 

将只打印一个换行符,因为#开始评论。

 echo "#!" 

#是以"开始的string的一部分" ,这样的string仍然是由bash检查特殊字符的, !是一个特殊的字符,如果后面跟着任何其他的文本。

 -bash: !": event not found 

在这种情况下,bash需要!"标记来引用shell历史中以"开始的前一个命令,并且没有find一个。 一切都靠自己! 不会触发这种行为:

 $ echo \# ! # ! $ echo fee ! fie fee ! fie 

最后,

 $ echo !echo 

产生两行,第一行是由shell打印显示如何扩展到上面的模式:

 echo echo '# !' 

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


另请参阅: History Expansion上的Bash手册页

 echo '#!' 

基本上,用双引号( " )又名”弱引用“,Bash用string做了一些古怪的事情,比如variablesreplace,用单引号强调引用string。

请参阅此处以获取对引用的更深入的解释。

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

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

另一个解决方法可能是在“!”之后放置额外的空间 :

 # echo "#! " #!