确认脚本是Windows换行符导致^M错误的方法是:先用cat -A查看是否显示^M$,再用file命令检查是否含CRLF或dos字样,最后在vi中执行:set ff?确认fileformat=dos。

怎么确认脚本确实是 Windows 换行符导致的 ^M 错误
先别急着改,得验证是不是这个原因。最直接的办法是用 cat -A 看真实字符:
-
cat -A your_script.sh—— 如果看到每行末尾都有^M$(比如#!/bin/bash^M$),基本就坐实了 -
file your_script.sh—— 输出里如果带CRLF或dos字样,也是铁证 -
vi your_script.sh进入后输入:set ff?,显示fileformat=dos就对了
注意:^M 不是字母 M,是回车符 \r 的可视化表示;$ 才是真正的行尾。两者连在一起 ^M$ 是 dos 格式的典型特征。
sed -i 's/\r$//' 为什么有时不生效
这个命令看着简单,但容易踩几个坑:
- 如果你在 macOS 或某些旧版 BusyBox 环境下运行,
sed不支持\r字面量写法,得换成sed -i '' $'s/\r$//'(macOS)或用printf '\r'构造 - 别用
sed -i 's/^M//'手动敲^M—— 绝大多数终端里这会触发 Ctrl+V 后再 Ctrl+M 才能输入,极易输错或漏掉 -
sed -i 's/\r$//' *.sh对空文件或只有一行没换行的脚本可能无效,建议加个dos2unix备选
真正保险的做法是:先 cat -A 确认存在 ^M,再执行命令,最后再 cat -A 对比是否变成 $ 结尾。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
没有 dos2unix 怎么办?三个替代方案
很多嵌入式 Linux(如 RK3588 板子)默认没装 dos2unix,但以下方法都可用:
tr -d '\r' your_script_fixed.sh && mv your_script_fixed.sh your_script.shawk '{sub(/\r$/,"")}1' your_script.sh > tmp && mv tmp your_script.sh- 进
vi后执行:set ff=unix→:wq(注意不是:set fileformat=unix,简写才有效)
其中 tr 最轻量,几乎所有 Linux 发行版都自带;vi 方式适合单个文件快速修复,但批量处理还是 sed 或 tr 更稳。
怎么避免下次再出这问题
根本解法不在 Linux 端,而在 Windows 编辑环节:
- VS Code 底部状态栏点击
CRLF→ 切成LF;或者全局设置"files.eol": "\n" - Git 提前配置:
git config --global core.autocrlf input(Linux/macOS 开发者用),让 Git 自动把 CRLF 转 LF 提交 - 别用记事本、Notepad++ 默认保存(它常悄悄存成 DOS 格式),改用 VS Code、Sublime 或 Vim for Windows
真正麻烦的不是修一次脚本,而是修完发现构建流程里还有五个同名脚本散落在不同目录——所以第一次排查时,顺手 find . -name "*.sh" -exec cat -A {} \; | grep '\^M$' 扫一遍更省事。

















