
修正する:これはバグでバージョン7.87.0で修正されました。https://github.com/curl/curl/commit/975efec61b83b840cf18ab2ee23b9202c60ca8a7
許可された回答は以前のバージョンでも機能しますが、自動アップグレード後もスクリプトが機能するようにアップグレードすることをお勧めします。
curl
私の箱の2つに問題があります。約24のLinuxインストールからcurl --connect-timeout
。
コマンド例は、2台のcurl --connect-timeout 3.14 https://example.com
マイコンピュータ(私の唯一のデスクトップ)でのみ失敗します。私の唯一のKubuntuのインストール。残りは主にUbuntu ServerといくつかのDebianインストールで、どちらもヘッドレスです。
これら2つのKubuntuデスクトップバージョンは異なります。 1つはアップグレードされたバージョン22.04 LTS、もう1つは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.04を実行するcurl --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