该命令printf "#!/bin/bash\n" > t
生成错误(bash: !/bin/bash\n": event not found
),但按向上键不会调用该命令,以便我可以对其进行修改。这是为什么?
(我在这里尝试的可以通过printf "%s\n" '#!/bin/bash' >t
我尝试学习 Bash 并真正想了解为什么 bash 历史记录不捕获先前的printf
命令来完成。)
答案1
正如您所发现的,该!
角色会触发历史扩展。此步骤发生在命令保存到历史记录之前,以便可以在已经完成扩展的情况下将其保存到历史记录中。当历史扩展中发生错误时,bash 会停止处理该命令,因此它永远不会保存到历史中。
历史扩展允许将先前的命令或先前命令的一部分替换为当前命令。如果在将命令保存到历史记录之前完成此操作,则每次执行时可能意味着不同的内容,因为之前的命令在每个实例中都不同。看http://www.gnu.org/software/bash/manual/bashref.html#History-Interaction
作为参考,zsh
的行为有所不同。它将保存命令,但缺少历史扩展。
答案2
bash: !": event not found
这是因为,在交互式 shell 的默认设置中,Bash 使用感叹号执行 csh 样式的历史记录扩展。这在 shell 脚本中不是问题;仅在交互式 shell 中。
最简单的解决方案是取消设置 histexpand 选项:这可以使用set +H
或 来完成set +o histexpand
。
您可以阅读更多相关内容在 Bash Pitfalls 网站上。