Windows MSYS2环境下通过xargs调用curl下载Artifactory文件失败求助
问题原因
这是MSYS2环境下换行符格式和jq输出格式共同导致的问题,具体原因如下:
jq .uri默认会给提取到的字符串外层包裹双引号,同时输出的行尾换行符是Windows风格的CRLF(\r\n),而非Linux风格的LF(\n)- 管道传给xargs时,xargs会将行尾的回车符(
\r)识别为URI的一部分,最终传给curl的URL末尾带有不可见的\r字符,因此curl判定URL格式非法报错 - 你用
xargs echo curl调试时,echo命令输出时会自动忽略不可见的\r字符,你复制内容到命令行执行时,系统也会自动过滤控制字符,因此直接执行可以成功。而配置文件模式下curl会自行处理行尾换行和引号规则,因此也能正常工作。
解决办法
你可以选择以下任意一种方案修复命令:
- 方案1:给jq添加
-r参数输出无引号的原始字符串,同时用tr命令删除回车符
curl "http://artifactory.xxx.xxx.com:8080/artifactory/api/storage/generic-tools/xxx-xxx/?lastModified" | jq -r .uri | tr -d '\r' | xargs curl
- 方案2:指定xargs的分隔符为换行符,自动忽略回车符
curl "http://artifactory.xxx.xxx.com:8080/artifactory/api/storage/generic-tools/xxx-xxx/?lastModified" | jq -r .uri | xargs -d '\n' curl
- 方案3:使用命令替换替代xargs,避免换行符处理问题
curl $(curl "http://artifactory.xxx.xxx.com:8080/artifactory/api/storage/generic-tools/xxx-xxx/?lastModified" | jq -r .uri)
内容的提问来源于stack exchange,提问作者Gerhard
相关产品推荐
相关产品推荐

