浮動小数点数でseq
コマンドを使用すると、入力にドットを使用しているにもかかわらず、出力には小数点の代わりにドットの代わりにコンマが含まれます。
seq 0.1 0.3 1.3
0,1
0,4
0,7
1,0
1,3
これはLC_NUMERIC
に設定されているロケールde_DE.UTF-8
とリンクしていると想定しましたが、en_US.UTF-8
への変更では修正されず、同じロケール設定を使用している別のシステムでは修正されますドットを返します。たとえば、フォーマットを明示的に定義することさえ-f %1.2
は、ドットではなくカンマを小数点記号として返します。
この動作をどこでどのように変更しますか?スクリプトが特定のシステムでエラーなしになるようにするにはどうすればよいですか? tr
などを介して再処理しないと、出力は今後の処理に使用できなくなります。
ドイツ語のタイムゾーンでMintの英語のインストールを使用し、他のマシンでRaspianを使用する.
編集:指定されたマシンのlocale
設定:
「コンマ」:
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
「ドット」の1つ:
LANG=C.UTF-8
LANGUAGE=
LC_CTYPE="C.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME="C.UTF-8"
LC_COLLATE="C.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="C.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=
LANGUAGE
を設定しても結果には影響しません。
ロケール自体のエラーを除外するために、de_DE.UTF-8
とen_US.UTF-8
の両方を(再)生成しました。
dpkg-reconfigure locales
そして今、seq
の動作はLC_NUMERIC
[〜#〜]と[〜#〜]LANG
に依存しているようです。
LC_NUMERIC
が未設定/空の場合、LANG
は動作を定義します。そうでない場合は、LC_NUMERIC
betweende_DE.UTF-8
とen_US.UTF-8
を切り替えると、それぞれカンマとドットに切り替わります。
特定の危険性
LANG
に誤った値や存在しない値を設定した場合や、ドットベースではないlocale
を設定した場合など、一部の特殊なケースでは動作が混在する可能性があります。
LANG=en_US
#it should be en_US.UTF-8
LC_NUMERIC=de_DE.UTF-8
seq 0.1 0.2 1.3
0.1
0.3
0.5
0.7
0.9
1.1
1,3
seq 0.1 0.2 1.4
では表示されませんが、seq 0.1 0.2 1.9
でも表示されます-非常に奇妙で、非常に危険な動作です。したがって、seq
の移植性に注意するか、スクリプトのロケールを定義してください。
ひどく推測すると、これは特定のケースでの手動による変更に関連しているようです(以下を参照してください: https://lists.gnu.org/archive/html/bug-coreutils/2008-09/msg00192.html )
更新:
ローカライズされた出力形式によるエラーを回避するためのメンテナーの提案は、スクリプト自体でロケールを定義することです(LC_NUMERIC=C
)。この動作の変更は計画されていません。 (以下のパッチ付きのリンクされたスレッドを参照)
ロケール設定が正しくないためにドットとカンマが混在して出力される問題はバグとして認識されており、メンテナによってすでにパッチが適用されています。
https://lists.gnu.org/archive/html/coreutils/2019-02/msg00002.html