web-dev-qa-db-ja.com

LANG = CとLC_ALL = Cの違いは何ですか?

シェルスクリプトのロケール固有の違いをすべて無効にしたい。それを行うための好ましい方法は何ですか?

LANG=CまたはLC_ALL=C

18
ceving

LANGはデフォルトのロケールを設定し、ie特定の設定がない場合に使用されるロケール(LC_COLLATELC_NUMERICLC_TIMEなど)が提供されます。設定を上書きするのではなく、基本値を提供します。一方、LC_ALLはすべてのロケール設定を上書きします。

したがって、スクリプトの設定を上書きするには、LC_ALLを設定する必要があります。

localeを実行すると、設定の効果を確認できます。明示的に設定されていないすべてのロケールカテゴリについて、計算された値が引用符で囲まれて表示されます。あなたの例では、LANGLC_NUMERICをオーバーライドしていません。デフォルト値を提供しています。 LC_ALLおよびLC_NUMERICが環境で設定されていない場合、ロケールはLANGから取得され、localeLC_NUMERICのその値を示します。引用符で示されます。

詳細は the locales manpage および 環境変数のPOSIX定義 を参照してください。参照 「ロケール」プログラムはどのように機能しますか?

25
Stephen Kitt

LANGはオーバーライドしません:

 $ export LC_NUMERIC = "de_DE.UTF-8" 
 $ export LANG = C 
 $ printf "%.2f\n" 3.14 
-bash:printf :3.14:無効な数値
 3,00 

だが LC_ALLは:

 $ export LC_NUMERIC = "de_DE.UTF-8" 
 $ export LC_ALL = C 
 $ printf "%.2f\n" 3.14 
 3.14 
5
ceving