我试图echo
通过将内容写入文件来创建脚本,而不是使用编辑器打开它
echo -e "#!/bin/bash \n /usr/bin/command args" > .scripts/command
Run Code Online (Sandbox Code Playgroud)
的输出:
bash: !/bin/bash: 事件未找到
我已将这种奇怪的行为与bang隔离开来。
$ echo !
!
$ echo "!"
bash: !: event not found
$ echo \#!
#!
$ echo \#!/bin/bash
bash: !/bin/bash: event not found
Run Code Online (Sandbox Code Playgroud)
我意识到这!
在命令行历史上下文中对命令行具有特殊意义,但除此之外,在运行脚本中,感叹号有时会导致解析错误。
我认为它与 an 有关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 …
Run Code Online (Sandbox Code Playgroud) 该命令会printf "#!/bin/bash\n" > t
生成一个错误 ( bash: !/bin/bash\n": event not found
),但按向上键不会调用该命令,因此我可以对其进行修改。这是为什么?
(我在这里尝试的东西可以通过printf "%s\n" '#!/bin/bash' >t
我尝试学习 Bash 并且真的想了解为什么 bash 历史记录没有捕获上一个printf
命令来完成。)
今天在另外两个问题中偶然发现这个现象后,我仔细研究了这个现象。我已经在默认情况下尝试了所有这些set -H
(历史扩展打开)。
为了测试脚本,我经常做一些事情,例如echo
ing 多行字符串并将其通过脚本进行管道传输,但在某些情况下会出现错误:
$ echo "foo
bar" | sed '/foo/!d'
bash: !d': event not found
>
Run Code Online (Sandbox Code Playgroud)
!
尽管用单引号括起来,但似乎会触发历史扩展。问题似乎是在同一行中出现双引号,因为
$echo $'foo\nbar' | sed '/foo/!d'
Run Code Online (Sandbox Code Playgroud)
效果也很好
$echo "foo
bar" |
> sed '/foo/!d'
Run Code Online (Sandbox Code Playgroud)
我的怀疑:历史扩展是按行应用的,所以'
后面的单个"
被认为是转义的,所以下面的!
没有转义。
现在我的问题是:这是一个错误还是预期的行为?复制bash
版本为 4.2.30 和 4.4.12。