通过 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
我正在使用 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