Linux 下 Shell 脚本换行符 DOS 格式导致执行报错如何转换?

文章导读
Linux 下执行 Shell 脚本报 ^M: bad interpreter 错误,通常是因为脚本包含 Windows 风格的 CRLF 换行符。最推荐的处理方向是使用 dos2unix 工具转换,适用场景为文本类脚本文件,风险边界在于转换前需备份原文件以防编码损坏。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

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$ 则表示存在回车符。

Linux 下 Shell 脚本换行符 DOS 格式导致执行报错如何转换?
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 错误,若正常输出则修复成功。

Linux 下 Shell 脚本换行符 DOS 格式导致执行报错如何转换?
./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