从 Windows 传上去的 deploy.sh 加了执行权限,运行报 ./deploy.sh: line 1: #!/bin/bash: No such file or directory,文件开头看着就是 #!/bin/bash。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,文件开头有三个字节 EF BB BF,内核读 shebang 时把 BOM 当成路径的一部分,找的是带 BOM 的解释器名。编辑器和 cat 都不显示这三个字节。

「BOM shebang 失效」这类改动最怕改一半,回滚脚本先准备好,再动生产。改完顺手把文档补一句,省得下次自己重新推一遍。

xxd -l 16 deploy.sh
sed -i '1s/^\xEF\xBB\xBF//' deploy.sh
bash deploy.sh

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

具体做法是,用 xxd 看文件头六个字节确认有 efbbbf;用 sed 去掉 BOM 或编辑器另存为 UTF-8 无 BOM;批量处理时用 dos2unix 加 --remove-bom;仓库里加 pre-commit 检查 BOM。

最后用这个标准收尾,xxd 开头变成 23 21 脚本能正常执行 不再报解释器找不到。

作者 9823189