locale
端末でコマンドを実行すると、シェルのロケール変数が印刷されます。
シェル以外に他のプロセスのロケール変数を取得する方法はありますか?
ベストアンサー1
LinuxのGNU xargs
:
xargs -r0a "/proc/$pid/environ" sh -c 'exec env -i -- "$@" locale' sh
環境コピーで実行されているlocale
プロセスのpidを、最後に$pid
実行したコマンドに渡します。
外部なので、locale
シェル変数(まだエクスポートされていない場合)ではなく、環境変数にのみ興味があります。
LC_*
、、変数をエクスポートしなくても、LANG
シェル自体のローカライズ設定が影響を受ける可能性があります。LANGUAGE
いくつかの注意:
- ローカライズを使用するプログラムは通常初期
setlocale(LC_ALL, "")
化されます。みんなローカライズ設定は環境に基づいていますが、必ずしもそうではありません。 setlocale()
他のパラメータで呼び出すこともできます(可能性は低い)。- 環境を変更する前または後に呼び出すことができます(
putenv()
/ etc APIを使用setenv()
)。 - これらの
putenv()
/setenv()
伝統的に公開された領域は変更されませんが、/proc/$pid/environ
IIRCは最新バージョンのLinuxおよびGNU libcで変更されました。 - 該当
putenv()
するかどうかにかかわらず、setenv()
プロセスは最終的に公開されるスタック領域を変更できます/proc/$pid/environ
(可能性は低い)。
別のオプションは、gdbをプロセスにリンクし、次のことです。
call system("locale")
しかし、これは非常に侵害的です。
プログラムはプロセス自体で準備された環境を使用します(environ
および/またはputenv()
/を使用すると仮定しますsetenv()
が、すべてのアプリケーション、特にシェルがこれを行うわけではありません)。
setlocale()
gdbを使用すると、実際にはNULLの2番目の引数で各ロケールカテゴリを呼び出して、ローカライズ設定を直接照会することもできます。
特定のカテゴリの価値を確認するには、次の手順に従ってください。
$ printf '#include <locale.h>\nLC_COLLATE\n' | gcc -E -x c - | tail -n 1
3
ロケール名を印刷するには、次のようにしますgdb
。
(gdb) p (char*)setlocale(3, 0)
$3 = 0xde8f40 "en_GB.UTF-8"
または:
(gdb) x/s setlocale(3, 0)
0xde8f40: "en_GB.UTF-8"