すべてのプロセスのロケール変数を取得するには?

すべてのプロセスのロケール変数を取得するには?

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/environIIRCは最新バージョンの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"

おすすめ記事