更新:这是一个错误,已在版本 7.87.0 中修复https://github.com/curl/curl/commit/975efec61b83b840cf18ab2ee23b9202c60ca8a7
接受的答案对于以前的版本仍然有效,但建议升级以确保脚本在自动升级后继续工作。
curl
我的两个盒子有问题。在大约两打 Linux 安装中,我在curl --connect-timeout
.
该示例命令curl --connect-timeout 3.14 https://example.com
仅在我的两台计算机(这是我唯一的桌面)上失败,我唯一的 Kubuntu 安装。其余的主要是 Ubuntu Server 和一些 Debian 安装,都是无头的。
这两款 Kubuntu 桌面版本不同,一款是升级版 22.04 LTS,一款是 20.04 LTS 版本。
Kubuntu 22.04curl --version
有
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl/zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.13
Release-Date: 2022-01-05
Kubuntu 20.04curl --version
有
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3
Release-Date: 2020-01-08
作为比较,运行的 Ubuntu Server 20.04curl --version
有
curl 7.68.0 (x86_64-pc-linux-gnu) libcurl/7.68.0 OpenSSL/1.1.1f zlib/1.2.11 brotli/1.0.7 libidn2/2.2.0 libpsl/0.21.0 (+libidn2/2.2.0) libssh/0.9.3/openssl/zlib nghttp2/1.40.0 librtmp/2.3
Release-Date: 2020-01-08
这与 Kubuntu 20.04 的curl --version
.
因此服务器也安装了这些版本,但有小数秒可以正常工作。
两者curl --manual
都会产生以下 grep 结果:
~ curl --manual | grep -e "--connect-timeout"
--connect-timeout <fractional seconds>
curl --connect-timeout 20 https://example.com
curl --connect-timeout 3.14 https://example.com
See also --connect-timeout. Added in 7.47.0.
See also -m, --max-time and --connect-timeout. Added in 7.59.0.
See also --connect-timeout.
(在 20.04 上有点不那么冗长)所以两者都在能够处理小数的所需版本内。
可能是什么原因造成的?
另一个观察结果:我md5sum
在 Kubuntu 20.04 和 Ubuntu 20.04 机器上做了一个测试,两者都返回相同的哈希值:
c337f891e41007612076a3bc43284aa7 /usr/bin/curl
所以可执行文件应该是相同的。
which curl
/usr/bin/curl
正在两台机器上返回。
(同样适用于 22.04 版本4b7b5099e836abd910f580808adc0874 /usr/bin/curl
)
难道是环境造成的?如何?
在所有情况下,我都用bash
和进行了检查zsh
。
答案1
该curl
程序似乎是区域设置感知的,这意味着字符串到数字的转换将取决于以下LC_NUMERIC
值
decimal_point
thousands_sep
grouping
numeric-decimal-point-wc
numeric-thousands-sep-wc
numeric-codeset
特别是,在de_DE.UTF-8
语言环境中,小数点字符是,
和.
是千位分隔符:
$ LC_ALL=de_DE.UTF-8 locale -k LC_NUMERIC
decimal_point=","
thousands_sep="."
grouping=3;3
numeric-decimal-point-wc=44
numeric-thousands-sep-wc=46
numeric-codeset="UTF-8"
因此,在这种语言环境中,3.14
确实不是“适当的数字参数” - 需要将其写入3,14
。所以
$ LC_NUMERIC="de_DE.UTF-8" curl --connect-timeout 3.14 https://example.com >/dev/null
curl: option --connect-timeout: expected a proper numerical parameter
curl: try 'curl --help' or 'curl --manual' for more information
然而
$ LC_NUMERIC="de_DE.UTF-8" curl --connect-timeout 3,14 https://example.com >/dev/null
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1256 100 1256 0 0 4880 0 --:--:-- --:--:-- --:--:-- 4887