通过 xargs 调用时,使用 curl 下载文件失败

Downloading file with curl fails when called through xargs

我正在使用 curl 从 Artifactory. I am on windows 10 using MSYS2 下载文件。

curl --version
curl 7.68.0 (x86_64-pc-msys) libcurl/7.68.0 OpenSSL/1.1.1d zlib/1.2.11 brotli/1.0.7 libidn2/2.3.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh2/1.9.0 nghttp2/1.40.0
Release-Date: 2020-01-08
Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS brotli Debug GSS-API HTTP2 HTTPS-proxy IDN IPv6 Kerberos Largefile libz Metalink NTLM NTLM_WB PSL SPNEGO SSL TLS-SRP TrackMemory UnixSockets
xargs --version
xargs (GNU findutils) 4.7.0
...

which xargs
xargs is an external : C:\msys64\usr\bin\xargs.exe

这是我的命令:

curl "http://artifactory.xxx.xxx.com:8080/artifactory/api/storage/generic-tools/xxx-xxx/?lastModified" | jq .uri | xargs curl

Curl 下载 json 文件并 jq 提取包含库信息的 json 文件的 url。 但是,第二个 curl 调用失败并显示:

curl: (3) URL using bad/illegal format or missing URL

将 xargs 命令更改为 xargs echo curl 会得到预期的输出。当 运行 此调试输出在命令行上时,正确的文件已下载且没有任何错误。

我还可以创建一个可以下载 json 文件的配置文件:

echo.|set /P =URL =  > latest.txt
curl ... | jq .uri >> latest.txt
curl --config latest.txt

为什么管道 xargs 命令不工作,但命令行命令以及配置文件选项工作正常?

来自 JQ 主页的 Windows 二进制文件遵循 DOS 行尾约定并使用 CRLF。来自 MSys2 的 xargs 二进制文件可能期望 Unix 约定的 EOL 只是 LF。所以 curl 看到一个额外的杂散 CR 字符,它假定它是 URL.

的一部分

通过使用类似这样的东西检查理论并检查杂散的 CR (0x0d) 字符 两个 URLs:

之间
jq '.uri' input.json  |xargs  echo | hexdump -C
00000000  68 74 74 70 3a 2f 2f 65  78 61 6d 70 6c 65 2e 63  |http://example.c|
00000010  6f 6d 2f*0d*20 68 74 74  70 3a 2f 2f 65 78 61 6d  |om/. http://exam|
00000020  70 6c 65 2e 63 6f 6d 2f  0d 0a                    |ple.com/..|
0000002a