为什么 Bash 历史记录不记录这个命令?

为什么 Bash 历史记录不记录这个命令?

该命令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 网站上

相关内容