我意识到这!
在命令行历史记录的上下文中在命令行上具有特殊意义,但是除此之外,在运行脚本中,感叹号有时可能会导致解析错误。
我认为与有关event
,但我不知道事件是什么或事件是什么。即使这样,同一命令在不同情况下的行为也可能不同。
下面的最后一个示例导致错误;但是为什么当相同的代码在命令替换之外起作用时呢?..使用GNU bash 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
。(由“单引号”保护)
var=$(…)
(不带双引号),它将按您期望的那样工作(我认为)。这仍然是“安全的”,因为一个简单的分配的值部分是不受分词或通配符(尽管这可能不是通过内建进行(例如分配的真实export
,local
所有的炮弹下等))。不幸的是,这并不超出简单的赋值,因为双引号是防止单词分裂和模糊的方法,同时在其他情况下仍可以进行其他类型的扩展。