file deploy.sh sed -i 's/\r$//' deploy.sh git config core.autocrlf input
脚本在服务器上执行报 /usr/bin/env: bash\r: No such file or directory,权限已经是 755。cat -A 看到每行结尾都是 ^M$。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,Windows 编辑器默认用 CRLF,回车符跟着 shebang 那一行被内核一起读进去。解释器路径变成 bash\r,这个文件当然不存在。
这次卡住的地方就在「CRLF 脚本报错」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
处理上按这个顺序:用 file 确认是不是 CRLF line terminators;dos2unix 或 sed 去掉每行结尾的 \r;仓库里加 .gitattributes 固定 eol=lf;提交前用 pre-commit 做一次换行检查。
改完只确认一件事:再执行脚本不再报 bad interpreter 输出正常 cat -A 里看不到 ^M。
