报错 /bin/bash^m: bad interpreter 或 $'\r': command not found 是因 windows 的 crlf(\r\n)换行符混入 linux,而 linux 仅识别 lf(\n);\r 被误解析为路径或命令导致失败。

脚本执行时报 /bin/bash^M: bad interpreter: No such file or directory 或 $'\r': command not found,基本可以锁定是 Windows 风格的 CRLF(\r\n)换行符混入了 Linux 环境。这不是编码(如 UTF-8/GBK)问题,而是**行尾格式(line ending)问题**——Linux 只认 LF(\n),而 Windows 写入的文件每行末尾多了一个不可见的 CR(\r)。这个 \r 会被解释器当作路径或命令的一部分,直接导致解析失败。
一眼识别:用可视化工具看“隐形字符”
别依赖普通编辑器或 cat,它们默认隐藏控制字符:
-
cat -A script.sh:会把\r显示为^M,结尾显示为^M$ -
od -c script.sh | head:以字符形式输出字节,看到\r \n连续出现就是 CRLF - Vim 中打开后输入
:set list:行尾显示^M,同时底部状态栏可能提示fileformat=dos
快速修复:终端里三秒搞定
无需安装额外工具,Linux 基础命令就能处理:
- 用 Vim 修改:
vim script.sh→ 输入:set ff=unix→:wq保存退出 - 用 sed 批量清理:
sed -i 's/\r$//' script.sh(删除行尾的\r) - 用 dos2unix(若已安装):
dos2unix script.sh
源头防控:避免下次再踩坑
光修一次不够,得让问题不再发生:
- Git 提交前自动转换:在项目根目录运行
git config core.autocrlf input(Linux/macOS 推荐),这样 Windows 提交的 CRLF 会被转成 LF 存入仓库 - 编辑器设为 Unix 换行:VS Code 设置中搜
files.eol改为\n;Notepad++ 在“编辑 → EOL 转换 → Unix (LF)” - 上传前检查:用
file script.sh查看结果,含CRLF line terminators就要处理
注意:不要混淆“文件编码”和“行尾格式”。UTF-8 编码的文件照样可以是 CRLF 格式;反过来,ASCII 编码的脚本如果用了 LF,Linux 也能正常执行。核心只看换行符类型,不看文字编码。











