我刚刚尝试了以下内容:
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,运输返回和 和: 如果启用了,除非出现CC_1,否则将执行历史扩展 在双引号中使用后斜线逃脱。后斜线 在!
。仅后斜线()和 单引号可以引用历史扩展字符。
=
。如果Extglob shell 启用了选项,(
也将抑制扩展。!
之前未删除。
对不应与:
进行干预的字符串使用单样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