Win7 Cmder(Git for Windows)下调用curl脚本返回错误码3问题排查
解决方案:curl返回错误码3(URL含
\r)的问题 这个问题的根源很明确:Windows和类Unix系统的换行符不兼容。你的url.txt是Windows格式保存的(每行结尾是\r\n),而Git for Windows的bash环境中,默认的read命令不会自动剔除行尾的\r(回车符),导致传给lib脚本的URL后面多了个隐形的\r——也就是你看到的$'https://example.com\r',这直接让curl识别无效URL,返回错误码3。
下面给你几种可行的解决办法,选适合你的就行:
方法1:转换文本文件为Unix格式
最直接的方式是把url.txt转换成Unix换行符格式(每行结尾仅\n):
- 如果你的环境里有
dos2unix工具,直接运行:dos2unix url.txt - 没有
dos2unix的话,用sed命令手动清理行尾的\r:sed -i 's/\r$//' url.txt
转换完成后再运行librun.sh,read读取的URL就不会带\r了。
方法2:在librun.sh的read环节处理换行符
修改librun.sh的循环逻辑,在读取每行时直接剔除\r,同时保留原行的空格等格式:
FILE=url.txt while IFS= read -r line; do # 移除行尾的回车符 line=${line%$'\r'} bash lib "$line" done < "$FILE"
这里的IFS=是为了保留行首或行尾的空格,-r参数防止read把URL里的反斜杠当成转义字符,${line%$'\r'}是bash的参数扩展语法,专门删除变量末尾的\r字符。
方法3:在lib脚本里兼容处理输入
如果希望lib脚本不管被怎么调用都能正常工作,可以在脚本里先清理传入的URL参数:
set -x # 清理URL末尾的回车符 clean_url=${1%$'\r'} curl.exe -s "$clean_url" echo $? echo "$clean_url"
这种方式相当于给脚本加了一层“容错垫”,即使调用方传入带\r的参数也能正常处理。
不管用哪种方法,处理后再运行脚本,set -x的输出应该会变回+ curl.exe -s 'https://example.com',curl也能正常返回0了。
内容的提问来源于stack exchange,提问作者user2959760
相关产品推荐
相关产品推荐

