如何回响一声巨响!

如何回响一声巨响!

echo我尝试通过将内容放入文件中来创建脚本,而不是使用编辑器打开它

echo -e "#!/bin/bash \n /usr/bin/command args"  > .scripts/command

输出:

bash: !/bin/bash: 未找到事件

我已将这种奇怪的行为与

$ echo !
!  

$ echo "!"
bash: !: event not found

$ echo \#!
#!

$ echo \#!/bin/bash
bash: !/bin/bash: event not found
  • 为什么爆炸会造成这种情况?
  • bash 指的这些“事件”是什么?
  • 如何解决这个问题并将“#!/bin/bash”打印到屏幕或我的文件上?

答案1

尝试使用单引号。

echo -e '#!/bin/bash \n /usr/bin/command args'  > .scripts/command

echo '#!'

echo '#!/bin/bash'

出现此问题是因为 bash 正在其历史记录中搜索 !/bin/bash。使用单引号可以避免这种行为。

答案2

作为里奇姆说, bash 正在尝试做一个历史比赛。避免这种情况的另一种方法是使用以下命令来逃避爆炸\

$ echo \#\!/bin/bash
#!/bin/bash

尽管请注意双引号内的 ,但\不会被删除:

$ echo "\!"
\!

答案3

!开始历史替换(“事件”是命令历史记录中的一行);例如!ls扩展到包含 的最后一个命令行ls,并!?foo扩展到包含 的最后一个命令行foo。您还可以提取特定单词(例如!!:1指上一个命令的第一个单词)等等;详细信息请参阅手册。

这个功能是为了在命令行版本还很原始的时候快速回忆起以前的命令而发明的。使用现代 shell(至少是 bash 和 zsh)和复制粘贴,历史扩展不再像以前那样有用 — 它仍然有用,但没有它你也可以过得去。

您可以通过设置变量来更改哪个角色触发历史替换histchars;如果你很少使用历史替换,你可以设置eg histchars='¡^',以便¡触发历史扩展而不是!.您甚至可以使用 完全关闭该功能set +o histexpand

答案4

所提出的解决方案在以下示例中不起作用:

$ bash -c "echo 'hello World!'"
-bash: !'": event not found
$

在这种情况下,可以使用八进制 ASCII 代码打印 bang:

$ bash -c "echo -e 'hello World\0041'"
hello World!
$

相关内容