以下失败,我不明白为什么:
$ echo "#!"
以下错误消息也会失败:
$ echo "\#!"
错误消息:
-bash: !": event not found
为什么会失败?如何改为echo
?
答案 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#!
答案 2 :(得分:4)
答案 3 :(得分:4)
另一种解决方法可能是在“!”之后增加一个空格。 :
# echo "#! "
#!
答案 4 :(得分:2)
在我的情况下,所有命令都有效。也许你可以指定你的环境。
$ echo "\#\!"
\#\!
$ echo "#!"
echo "#"
#
$ echo "#!"
echo "#"
#
$ echo $BASH_VERSION
3.2.48(1)-release