技术 · 实用指南
Bash 报“bad interpreter”?转换脚本前先检查 shebang 字节
先区分 CRLF、解释器路径错误、运行时缺失和访问失败,再编辑文件或修改权限。

bad interpreter 是直接执行路径的证据,不等于 Bash 本身损坏。Linux 把可执行脚本首行解析为解释器路径;回车字节、拼写错误、缺失运行时或访问边界都可能让该路径失败。
不要先运行 dos2unix、chmod、改 shebang 或用 bash script.sh 绕过。先保留错误与首行字节,再按 ENOENT 与 EACCES 分类,只修已证实的边界。
冻结错误与首行字节
记录原命令和完整消息。用 od -An -t x1 -N 64 script.sh 等字节可视工具检查首行:CRLF 结尾是 0d 0a,LF 是 0a。
同时记录 file、ls -l 和文件系统或容器上下文。编辑、保存或重新检出都可能抹掉区分内容、路径和访问故障的证据。
解析内核实际看到的解释器路径
逐字读取 #! 后的路径,确认它是绝对路径、拼写正确,并存在于真正执行脚本的环境。少一个斜杠或把 usr 写成 user 都不是 CRLF。
若使用 /usr/bin/env,确认 env 与目标程序在同一上下文可解析,不要假设交互 shell、入口点与 CI 共用 PATH 和根文件系统。
区分 ENOENT、EACCES 与绕过线索
No such file 可能指脚本或解释器,也包括被 CR 污染的解释器名;access 错误则指向路径搜索、文件类型、执行位或 noexec。
bash script.sh 成功只证明 Bash 能读文件,不证明直接 shebang 正确。把它当诊断线索,不当最终修复。
应用最小修复
仅在字节证明 0d 0a 时转换为 LF,并再次核字节。路径错就只改 shebang;解释器缺失就安装或选择预期运行时。
遇到 EACCES 时检查脚本和解释器执行位、父目录搜索权限、文件类型与挂载选项。不要一次混合多个修复。
防止复发并执行退出测试
跨平台仓库可审查 *.sh text eol=lf。干净工作树中先用 git status 和 git diff 检查重规范化,避免夹带内容改动。
回到原失败上下文直接执行,确认解释器、首行字节和检出策略。若错误类型变化,停止并单独诊断新边界。
