卷曲:选项--connect-timeout:期望正确的数字参数

卷曲:选项--connect-timeout:期望正确的数字参数

更新:这是一个错误,已在版本 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

相关内容