コマンドの結果を英語で出力したい!ソースコードを追ってみた

| | Comments (0) | TrackBacks (0)

こんにちは、しのはら です。

Linuxでコマンドの結果をパースするとき、言語を統一して取り扱いたい。
そんなときは、コマンドの先頭に「LANG=C」と書けば、コマンドの結果を英語で出力できます。


例)

・日本語
# df -k
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/mapper/VolGroup00-LogVol00
                     147282220  45936656  93743388  33% /
/dev/sda1               101086     13429     82438  15% /boot
tmpfs                   901640         0    901640   0% /dev/shm
none                    901552       176    901376   1% /var/lib/xenstored

・英語
# LANG=C df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
                     147282220  45936660  93743384  33% /
/dev/sda1               101086     13429     82438  15% /boot
tmpfs                   901640         0    901640   0% /dev/shm
none                    901552       176    901376   1% /var/lib/xenstored

(環境はCentOS5.3です)


でも、そんな「LANG=C」でもコマンドの結果を英語で出力できないコマンドを発見したので、ご紹介します。


「LANG=C」でコマンドの結果を英語で出力できないコマンド、それはINITスクリプトです。

INITスクリプトとは、/etc/rc.d/init.d/*以下のデーモンを起動停止するスクリプト達です。


例)

# /etc/init.d/ntpd status
# /etc/init.d/ntpd status
ntpd (pid 16185) を実行中...

# LANG=C /etc/init.d/ntpd status
# /etc/init.d/ntpd status
ntpd (pid 16185) を実行中...


ソースコードを見てみると、INITスクリプトのライブラリの/etc/rc.d/init.d/functionが悪さをしていました。
/etc/rc.d/init.d/functionで読み込まれている/etc/profile.d/lang.shに、以下のようなコードが記述されています。
# LANG=C /etc/init.d/ntpd status
for langfile in /etc/sysconfig/i18n $HOME/.i18n ; do
    [ -f $langfile ] && . $langfile && sourced=1
done
/etc/sysconfig/i18nのファイルには「LANG="ja_JP.UTF-8"」と書かれており、強制的に設定したLANGが変更されるようになっていました。


ですがその下のコードには、以下のようなコードが記述されていました。
if [ -n "$GDM_LANG" ]; then
sourced=1
LANG="$GDM_LANG"
unset LANGUAGE
if [ "$GDM_LANG" = "zh_CN.GB18030" ]; then
export LANGUAGE="zh_CN.GB18030:zh_CN.GB2312:zh_CN"
fi
fi
どうやら、GDM_LANGを設定すれば、LANGが変更されるようです。


# GDM_LANG=C /etc/rc.d/init.d/ntpd status
ntpd (pid 16185) is running...
思った通り、コマンドの結果が英語になりました!

INITスクリプトのコマンドの結果を英語にするには、コマンドの先頭に「GDM_LANG=C」を書けばよいようです。


【埋め草】
INITスクリプトのほかに、/sbin/serviceコマンドでもデーモンの起動停止ができますが、 /sbin/serviceコマンドは、「LANG=C」でも「GDM_LANG=C」でもコマンドの結果を英語にすることができませんでした。

ソースコードを見てみると、以下のようなコードが記述されています。
env -i LANG="$LANG" PATH="$PATH" TERM="$TERM" "${SERVICEDIR}/${SERVICE}" status


最終的に、設定した環境変数を無視しているのでした。。。


【2009.09.10修正】
もう一度ソースコードを読み返すと、NOLOCALEに値を設定すれば/etc/profile.d/lang.shを読み込まなくなり、INITスクリプトのコマンド結果を英語にすることができました。
if [ -f /etc/sysconfig/i18n -a -z "${NOLOCALE:-}" ] ; then

  . /etc/profile.d/lang.sh

fi

# LANG=C NOLOCALE=1 /etc/init.d/ntpd status
ntpd (pid 2714) is running..

また「GDM_LANG」はGDM(Gnome Display Manager)が使う環境変数なので、INITスクリプトのコマンドの結果を英語にするには、コマンドの先頭に「LANG=C NOLOCALE=1」を書くほうがよいようです。

ちなみに、/bin/serviceコマンドは「LANG=C NOLOCALE=1」でも無理でした。
LangDetectja>en YahooC
NOLOCALE

0 TrackBacks

Listed below are links to blogs that reference this entry: コマンドの結果を英語で出力したい!ソースコードを追ってみた.

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/149

Leave a comment

About this Entry

This page contains a single entry by junichi shinohara published on September 9, 2009 12:00 PM.

メーリングリスト配送システムを作ってみた was the previous entry in this blog.

Devel::NYTProfを使ってみた。 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.