web-dev-qa-db-ja.com

LANG = Cは、いくつかの/etc/init.d/*スクリプトに含まれています。 LANG = Cは何をし、なぜLANG = Cを設定する必要があるのですか。

それが何をするのか、何が含まれているのかは明確ではありません。 setとenvの出力を調べて、システムの他の場所でCまたはLANGがどのように設定されているかを確認しました。それがどのように使用または設定されているかについては何も明確ではありませんでした。どのmanページを読み始めるべきかさえわかりません。

さまざまなLinuxマシンで起動スクリプトをデコードしようとしているので、ここでの助けは素晴らしいでしょう。誰かがこのプロセスに沿って役立つ良いリソース(本、ドキュメント)を推薦できるならそれは大いにありがたいです。

Centos6マシンでLANG = Cを使用するスクリプトの例

 $ grep -i LANG = C ./*
./halt:LANG=C __umount_loop '$ 2〜/^ \/$ | ^ \/proc | ^ \/dev/{next} 
 ./ netconsole:route = $(LANG = C ip -o route get to $ Host/32)
。/netconsole:arp = $(LANG = C/sbin/arping -c 1 -I $ DEV $ target 2>/dev/null | awk '/。* [。*]/{print gensub( "。* replyfrom。* \\ [(。*)\\]。*"、 "\\ 1"、 "G")} ')
。/netconsole:SYSLOGADDR = $(LANG = C Host $ SYSLOGADDR 2>/dev/null | awk'/has address/{print $ NF} ')
 ./ network:LANG = C sed -e "$ __ sed_discard_ignored_files"\
 ./ network:LANG = C sort -k 1,1 -k 2n |\
 ./ network:LANG = C sed's///')
 ./ network:eval $(LANG = C fgrep "DEVICE =" ifcfg- $ i)
 ./ network:eval $(LANG = C fgrep "TYPE =" ifcfg- $ i)
 ./ network:eval $(LANG = C fgrep "SLAVE =" ifcfg- $ i)
 ./ network:if LANG = C egrep -L "^ ONBOOT = ['\"]?[Nn] [Oo] ['\"]?" ifcfg- $ i>/dev/null; then 
 ./ network:if! LANG = C egrep -L "^ ONBOOT = ['\"]?[Nn] [Oo] ['\"]?" ifcfg- $ i>/dev/null 2>&1; then 
 ./ network:eval $(LANG = C fgrep "DEVICE =" ifcfg- $ i)
。/network:eval $(LANG = C fgrep "TYPE =" ifcfg- $ i )
 ./ rpcbind:#通常のコンソールでは起動時に日本語を使用できないため、強制的にLANG = C。
 ./ rpcbind:LANG = C 

Ubuntu10.04マシンのスクリプトでの使用例

 $ grep -i LANG = C ./*
./Apache2:ENV="env -i LANG = C PATH =/usr/local/bin:/ usr/bin:/ bin " 
 ./ exim4:LANG = C 
 ./ ntop:export LANG = C\
8
nelaaro

これにより、アプリケーションは出力にデフォルト言語を使用するように強制され、ソートはバイト単位で実行されます。

$ LANG=es_ES man
¿Qué página de manual desea?
$ LANG=C man
What manual page do you want?
$ LANG=en_US sort <<< $'a\nb\nA\nB'
a
A
b
B
$ LANG=C sort <<< $'a\nb\nA\nB'
A
B
a
b

すでに説明したように、LANG環境変数はローカリゼーションを制御します。

sortgrepawkなどの多くの標準コマンドラインツールに影響します。

その値を「C」に設定すると、これらすべてのツールは、基本的なASCII文字のみを考慮し、UTF-8マルチバイト一致を無効にするように指示されます。

その環境変数を使用するローカリゼーションよりももう1つの理由は、パフォーマンスです。grepバージョン<2.7の場合、grepを1000倍速くすることができます: http://rg03.wordpress.com/ 2009/09/09/gnu-grep-is-slow-on-utf-8 /

文字「C」が「安全な」基本ロケールを指定するために使用される理由については、 なぜ「LANG = C」?(DまたはEまたはFではない) を参照してください。

7
Lucas Cimon

LANG = Cは、ローカリゼーションを無効にする方法です。これは、現在の言語に基づいて異なる可能性のあるプログラム出力を予測するためにスクリプトで使用されます。詳細については、 this をお読みください。

4