回声“#!”失败 – “未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 "#! " #!