Watch at Ease看见世界,读懂生活。

技术 · 实用指南

Bash 报“bad interpreter”?转换脚本前先检查 shebang 字节

先区分 CRLF、解释器路径错误、运行时缺失和访问失败,再编辑文件或修改权限。

原创示意图:显示 Bash shebang 中的 CR 与 LF 字节。
原创示意图:修改脚本前保留首行字节。 Watch at Ease

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 检查重规范化,避免夹带内容改动。

回到原失败上下文直接执行,确认解释器、首行字节和检出策略。若错误类型变化,停止并单独诊断新边界。

原创示意图:区分 CRLF、错误路径、缺失解释器、访问拒绝与绕过。
原创示意图:根据证据选择修复。 Watch at Ease