为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕田峪7331174 2019-07-08 13:06:36
回声“#!”失败-“事件未找到”以下内容失败了,我不明白为什么:$ echo "#!"使用相同的错误消息,下列操作也会失败:$ echo "\#!"错误信息:-bash: !": event not found为什么会失败?如何echo取而代之的是?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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

如果不使用此功能,set +o histexpand(又名set +H)停止这种行为。它是关闭的脚本,但经常启用的交互式使用。

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

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

 echo '#!'"$SHELL"

(请注意相邻的单引号和双引号字符串;在shell完成此操作后,将移除引号并删除字符串。#!将在变量的值旁边输出。SHELL)或其他一些常见的解决办法,如

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


查看完整回答
反对 回复 2019-07-08
?
ITMISS

TA贡献1871条经验 获得超8个赞

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

巴什

echo #!

将只打印换行符,如#开始评论。

在……里面

echo "#!"

这个#开始的字符串的一部分。"..bash仍然检查这些字符串是否有特殊字符。!是一个特殊的字符当且仅当它后面跟着任何其他文本。

-bash: !": event not found

在本例中,bash期望!"令牌引用shell历史记录中的前一个命令,以"却找不到。独自一人,!不会触发此行为:

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

最后,

$ echo !echo

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

echo echo '# !'

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


另见:Bash手册页在……上面历史扩展


查看完整回答
反对 回复 2019-07-08
?
德玛西亚99

TA贡献1770条经验 获得超3个赞

echo '#!'

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

见A.这里以获得更深入的引证解释。


查看完整回答
反对 回复 2019-07-08
  • 3 回答
  • 0 关注
  • 309 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信