こんにちは、しのはら です。
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
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=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修正】
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
Leave a comment