linux下shell脚本因windows编辑导致crlf换行符报错,需先用file、cat -a等命令定位^m字符,再用sed、vim等修复并设lf格式,最后通过git和编辑器配置预防复发。

Linux下Shell脚本因CRLF换行符报错(如 bad interpreter: No such file or directory 或 $'\r': command not found),本质是Windows编辑的脚本带了多余的 \r 字符,破坏了shebang行和命令解析。解决需分两步:先准确定位,再针对性修复并预防复发。
一、快速定位CRLF问题
不用猜,用命令直接验证:
-
看文件类型描述:
file your_script.sh—— 若输出含with CRLF line terminators,即确诊 -
显式显示隐藏字符:
cat -A your_script.sh | head -3—— 出现^M就是\r,例如#!/bin/bash^M -
搜索\r字符:
grep -U $'\r' your_script.sh或grep -P '\r' your_script.sh(部分grep支持) -
Vim中直观查看:用
vim your_script.sh打开,底部状态栏若显示dos或fileformat=dos,说明是CRLF格式
二、立即修复已损坏脚本
推荐按优先级选择以下任一方式(无需安装额外工具也可完成):
-
用sed安全去\r:
sed -i 's/\r$//' your_script.sh(只删行尾\r,最稳妥) -
用tr彻底清除所有\r:
tr -d '\r' fixed.sh && mv fixed.sh your_script.sh -
用vim一键转格式:打开后执行
:set ff=unix→:wq(自动重写为LF) -
批量处理多个脚本:
for f in *.sh; do sed -i 's/\r$//' "$f"; done
修复后务必加执行权限:chmod +x your_script.sh,再运行验证。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
三、从源头杜绝CRLF再次出现
单次修复治标,配置到位才治本:
-
Git全局设为LF提交:
git config --global core.autocrlf input(Linux/macOS开发者适用) -
项目级强制规范:在仓库根目录建
.gitattributes,写入*.sh text eol=lf,确保所有.sh始终以LF存入仓库 -
编辑器统一设置:
- VS Code:右下角点击
CRLF→ 选LF,并设为默认 - IntelliJ IDEA:File → Settings → Editor → Code Style → Line separator → 选
Unix and macOS (\n) - Notepad++:编辑 → EOL转换 → Unix (LF)
- VS Code:右下角点击
四、验证是否真正修复
别只看脚本能跑,要确认底层干净:
- 再次运行
file your_script.sh,应显示with CRLF line terminators消失 - 执行
head -1 your_script.sh | cat -A,输出应为#!/bin/bash$(无^M) - 用
bash -x your_script.sh跟踪执行,不再出现$'\r'类错误提示
不复杂但容易忽略,关键是把定位、修复、预防串成闭环。一次配好,后续脚本再也不会被^M绊倒。










