Linux 下执行 Shell 脚本报 ^M: bad interpreter 错误,通常是因为脚本包含 Windows 风格的 CRLF 换行符。最推荐的处理方向是使用 dos2unix 工具转换,适用场景为文本类脚本文件,风险边界在于转换前需备份原文件以防编码损坏。
先说结论:脚本报错多由换行符不兼容引起,优先使用 dos2unix 修复,无该工具时可用 sed 替代。
- 先确认:使用 file 或 cat -A 命令检查脚本是否包含 ^M 或 CRLF 标记。
- 先处理:执行 dos2unix 或 sed 命令移除回车符,操作前务必备份原文件。
- 再验证:通过 bash -n 检查语法,并重新执行脚本确认报错消失。
命令速用版
若系统已安装 dos2unix,直接运行以下命令转换指定脚本:
dos2unix script.sh若未安装 dos2unix,可使用 sed 命令原地替换换行符:
sed -i 's/\r$//' script.sh为什么会这样
根本原因是 Windows 和 Linux 对换行符的定义不同,导致 Linux Shell 将回车符视为命令的一部分。Windows 系统使用 CR+LF(\r\n)作为行结束符,而 Linux 仅使用 LF(\n)。当 Shell 解释器读取带有 \r 的脚本时,会将 \r 当作命令名称的末尾字符,导致找不到命令或解释器路径错误。
分步处理
按照以下步骤安全修复脚本换行符问题,每步完成后需确认状态再继续。
步骤 1:备份原文件
防止转换过程中编码损坏或误操作,先复制一份原脚本。
cp script.sh script.sh.bak步骤 2:确认文件格式
使用 file 命令查看脚本类型,若显示 CRLF line terminators 则确认为 DOS 格式。
file script.sh或使用 cat -A 查看隐藏字符,行尾若显示 ^M$ 则表示存在回车符。
cat -A script.sh步骤 3:执行转换
优先使用 dos2unix 工具,若提示 command not found 则改用 sed 方案。
dos2unix script.sh步骤 4:检查执行权限
转换完成后,确保脚本具有执行权限,否则仍无法运行。
chmod +x script.sh怎么验证是否生效
转换完成后,需通过语法检查和实际运行两种方式验证修复结果。
方法 1:语法检查
使用 bash -n 参数检查脚本语法,若无输出则表示语法通过。
bash -n script.sh方法 2:再次查看格式
重复 file 命令,确认输出中不再包含 CRLF 字样,仅显示 ASCII text 或 Bourne-Again shell script。
file script.sh方法 3:实际运行
直接执行脚本,观察是否仍报 ^M 错误,若正常输出则修复成功。
./script.sh常见坑
处理换行符问题时,以下几个场景容易导致二次故障或数据丢失。
二进制文件误转换
dos2unix 仅适用于文本文件,若对二进制文件或图片执行转换,会导致文件损坏无法使用。
Shebang 行残留
部分编辑器仅修改部分内容,需确认第一行 #!/bin/bash 末尾没有残留 ^M,否则仍会报 bad interpreter。
权限丢失
某些转换工具或重定向操作可能会重置文件权限,转换后需重新 chmod +x 赋予执行权。
常见问题
没有 dos2unix 命令怎么办?
使用 sed 或 tr 命令替代,sed -i 's/\r$//' filename 可直接移除行尾回车符。
Vim 编辑器如何修改换行符?
在 Vim 中执行 :set ff=unix 然后保存 :w,即可将当前缓冲区格式转为 Linux 标准。
转换后脚本仍然报错怎么办?
检查脚本内容是否包含其他不可见字符,或使用 bash -x 调试模式查看具体执行卡点。
参考来源
- GNU Sed Manual, Section: Overview, https://www.gnu.org/software/sed/
- dos2unix Project Home, Usage Information, https://dos2unix.sourceforge.io/
- Linux Man Pages, file command documentation, https://man7.org/linux/man-pages/man1/file.1.html