为什么我不能在 bash 中回声"!"?



我刚刚尝试了以下内容:

echo "Hello World!" > hw.txt

我得到了这个错误:

bash: !": event not found

我尝试了 escaping !这样:

echo "Hello World!" > hw.txt

但是hw.txt包含:

Hello World!

现在我尝试了:

echo "Hello!World" > hw.txt

我得到了:

bash: !World": event not found

但是当我尝试此操作时:

echo "Hello ! World" > hw.txt

令我惊讶的是它有效!

所以我尝试了以下操作:(末尾注意space。)

echo "Hello World! " > hw.txt

即使在引号中,bash为什么也这样处理!?它如何与trailing space一起使用?我是否缺少明显的东西?

此行为在历史扩展下的Bash Man页面中指定

历史扩展是通过历史的出现而引入的 扩展字符,默认情况下是!。仅后斜线()和 单引号可以引用历史扩展字符。

如果立即发现,几个字符会阻止历史扩展 遵循历史扩展特征,即使没有引用: 空间,选项卡,newline,运输返回和=。如果Extglob shell 启用了选项,(也将抑制扩展。

和:

如果启用了,除非出现CC_1,否则将执行历史扩展 在双引号中使用后斜线逃脱。后斜线 在!之前未删除。

对不应与:

进行干预的字符串使用单样
echo '!'

使用可以干预的字符串的双引号:

echo "$PWD"

尾随空间禁用bash事件指定器!

man bash | less -Ip 'Event Designators'
# An  event designator is a reference to a command line entry in the his-
# tory list.  Unless the reference is absolute, events  are  relative  to
# the current position in the history list.
# 
# !     Start  a  history substitution, except when followed by a blank,
#       newline, carriage return, = or ( (when the extglob shell  option
#       is enabled using the shopt builtin).

禁用事件指定器!的另一种方法是使用:

set +H  # ... or ...
set +o histexpand
help set

相关内容

  • 没有找到相关文章

最新更新