WSL Ubuntu克隆的Bash GitHub项目运行失败,dos2unix无效如何解决?
问题原因
报错信息中的$'{\r''关键字明确指向核心问题为脚本行尾使用了Windows格式的CRLF(\r\n),而非Linux Shell兼容的LF(\n),该问题与GitHub存储本身无关,由Git的行尾自动转换配置导致:
- 原编写脚本的WSL环境Git配置
core.autocrlf被设为true,推送时Git自动将本地LF行尾转换为CRLF存储到远程仓库 - 另一台设备克隆时,Git配置未开启自动将CRLF转回LF的规则,拉取到本地的脚本保留了CRLF行尾,触发bash解析报错
- 之前dos2unix转换未生效属于操作异常:要么未指定正确的目标脚本文件,要么当前用户对脚本无写入权限,转换动作未实际落地
修复方案
临时修复当前报错脚本
- 先验证行尾格式:执行
cat -A <你的脚本文件名>,如果每行末尾显示^M$即可确认是CRLF格式问题 - 执行以下任意命令完成行尾转换:
- dos2unix转换:
dos2unix <你的脚本文件名> - sed直接移除回车符:
sed -i 's/\r$//' <你的脚本文件名> - tr命令过滤回车符:
tr -d '\r' < <你的脚本文件名> > temp.sh && mv temp.sh <你的脚本文件名>
- dos2unix转换:
- 赋予执行权限后测试运行:
chmod +x <你的脚本文件名> && ./<你的脚本文件名>
全局配置Git避免后续复发
在所有使用的WSL/Ubuntu环境执行以下配置,统一行尾转换规则:
- 提交时自动将CRLF转为LF,拉取时不自动转换为CRLF:
git config --global core.autocrlf input - 开启行尾合法性检查,禁止提交包含CRLF的Shell类文件:
git config --global core.safecrlf true
如果项目需要跨Windows/Linux协作,可在项目根目录新增.gitattributes文件,指定脚本类文件强制使用LF行尾:
*.sh text eol=lf *.bash text eol=lf
内容的提问来源于stack exchange,提问作者YorSubs
相关产品推荐
相关产品推荐

