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
答案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!
$