【亲测有效】解决 “Batch script contains DOS line breaks (\r\n)” 报错
适用场景:在 Linux/Slurm 集群上
sbatch
提交脚本或运行 Shell 脚本时遇到 “DOS line breaks (\r\n) instead of UNIX line breaks (\n)” 的报错。
文章目录
- 【亲测有效】解决 “Batch script contains DOS line breaks (\r\n)” 报错
- 一、问题重述
- 二、根因分析:CRLF vs. LF
- 三、解决方案大全
- 方案 1:一条命令搞定 `dos2unix` ✅
- 方案 2:`sed` & `tr` 手工去回车
- 方案 3:Vim/Neovim 修改文件格式
- 方案 4:VS Code 直接切换
- 方案 5:Git 全局避免 CRLF(可选)
- 四、如何自检脚本是否还有 `\r`?
- 五、解决方法小结
一、问题重述
在 Windows 或 VS Code 下编辑完 run_python.sbatch
,上传到集群后执行:
(环境名) [用户名@节点名 文件夹]$ sbatch run_python.sbatch
sbatch: error: Batch script contains DOS line breaks (\r\n)
sbatch: error: instead of expected UNIX line breaks (\n).
脚本明明写得没问题,却无法提交。究其原因,就是换行符不兼容。
二、根因分析:CRLF vs. LF
- Windows 系统(含部分编辑器)使用 CRLF (
\r\n
) 作为换行符; - Linux/Unix 默认使用 LF (
\n
); sbatch
解析脚本时检测到意外的\r
回车符,便拒绝执行。
三、解决方案大全
方案 1:一条命令搞定 dos2unix
✅
# 安装好 dos2unix 的系统
dos2unix run_python.sbatch
sbatch run_python.sbatch # 再次提交
若仅输出 “dos2unix: converting file run_python.sbatch to Unix format ...
”,没有出现报错,即转换成功。
方案 2:sed
& tr
手工去回车
集群没有 dos2unix
时,用内置命令即可:
# 备份原文件
cp run_python.sbatch run_python.sbatch.bak# 方法 A:sed
sed -i 's/\r$//' run_python.sbatch# 方法 B:tr
tr -d '\r' < run_python.sbatch > tmp && mv tmp run_python.sbatch
方案 3:Vim/Neovim 修改文件格式
vim run_python.sbatch
:set ff=unix # fileformat=unix
:wq # 保存退出
方案 4:VS Code 直接切换
- 右下角状态栏点击 “CRLF”;
- 选择 “LF”;
- Ctrl + S 保存;再次上传或 Git push。
方案 5:Git 全局避免 CRLF(可选)
# 仅对当前仓库
git config core.autocrlf false# 或全局
git config --global core.autocrlf input
这样以后在 Windows 提交到 Linux 也会保持 LF。
四、如何自检脚本是否还有 \r
?
grep -n $'\r' run_python.sbatch # 有输出说明仍存在 \r
五、解决方法小结
- 统一开发环境:建议在 WSL、Docker、远程 Vim 等 Linux 环境直接写脚本。
- 版本控制钩子:在 Git 钩子或 CI 中加入
dos2unix
检查,防患于未然。 - 编辑器配置:VS Code、Sublime、Notepad++ 都可设置默认保存为 LF。
脚本因换行符差异导致的 sbatch
报错,是新手在 HPC 环境最常见的坑之一。在 Linux 系统中,LF 才是正确的换行符。
希望本文能帮你一次性解决这个小问题!