【親測有效】解決 “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 才是正確的換行符。
希望本文能幫你一次性解決這個小問題!