浮動小数点でコマンドを使用すると、入力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
特定のコンピュータの設定:
"カンマ" 1:
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
結果に影響しません。
答え1
ロケール自体のエラーを排除するために(再び)生成してde_DE.UTF-8
通過en_US.UTF-8
しました。
dpkg-reconfigure locales
今seq
、行動は次のようになります。LC_NUMERIC
そして LANG
。
LC_NUMERIC
設定されていない場合/ nullの場合はLANG
動作を定義し、そうでない場合はそれぞれLC_NUMERIC
コンマとドットを切り替えますde_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
に奇妙でIMHO非常に危険な行動でもあります。したがって、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