【亲测有效】解决 “Batch script contains DOS line breaks (\r\n)” 报错

适用场景:在 Linux/Slurm 集群上 sbatch 提交脚本或运行 Shell 脚本时遇到 “DOS line breaks (\r\n) instead of UNIX line breaks (\n)” 的报错。


一、问题重述

在 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

  1. Windows 系统(含部分编辑器)使用 CRLF (\r\n) 作为换行符;
  2. Linux/Unix 默认使用 LF (\n);
  3. 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 直接切换

  1. 右下角状态栏点击 “CRLF”;
  2. 选择 “LF”;
  3. 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

五、解决方法小结

  1. 统一开发环境:建议在 WSL、Docker、远程 Vim 等 Linux 环境直接写脚本。
  2. 版本控制钩子:在 Git 钩子或 CI 中加入 dos2unix 检查,防患于未然。
  3. 编辑器配置:VS Code、Sublime、Notepad++ 都可设置默认保存为 LF。

脚本因换行符差异导致的 sbatch 报错,是新手在 HPC 环境最常见的坑之一。在 Linux 系统中,LF 才是正确的换行符。

希望本文能帮你一次性解决这个小问题!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐