Wine上の環境変数の扱い

Last modified: 2021-10-22

Wineを動かすOS上の環境変数と置換される環境変数

Wine上のソフトウェアから見える環境変数の扱い

Wine上で動作しているプログラムから見た環境変数は以下のようになる。

  • Wineのレジストリで定義されているものは、これが優先されて用いられる
  • Wineのレジストリで定義されておらず、なおかつWineを動かしているOSにおける同名の環境変数が定義されているものは、それがそのまま使用される
  • いずれにおいても定義されていない環境変数は未定義扱い

Linux版SteamでProtonを使用する際の環境変数(DXVK関係含む)についても、基本的にはゲームごとの “起動オプション” における実行時の変数としてそのまま指定するだけで反映されると考えて問題ない(例:DXVK_HUD=... %command%)。

初期状態で置換される環境変数

Windows用の幾つかの特殊な定義済み環境変数についてはWine内でも(初期状態では)置き換えられる。

具体的にはPATHTEMP/TMPなどで、他のものについては後述のシステム環境変数のレジストリ階層を参照。

これらを削除するとそのWine環境(WINEPREFIXで指定される実行環境)内のプログラムが正しく動作しなくなるおそれがある。

システム環境変数とユーザ環境変数

Windowsと同様、Wine内の環境変数にはシステム全体の環境変数とユーザ別の環境変数がある。

  • 同名の環境変数がいずれか一方で定義されている場合: 定義されているほうの値が使用される
  • 両方が定義されている場合:
    • PATHの場合だけはシステム環境変数PATH後ろにユーザ環境変数PATH付け加えられる仕様(Wine 1.1.38以上)
      • Wine環境においてはシステム環境変数のPATHも自由に変更できるため、ユーザ環境変数のPATHが低優先度であることが問題になることはない
      • Wine 1.1.37まではユーザ環境変数PATHについてもシステム環境変数PATHを置き換える仕様だった
  • いずれの環境変数もレジストリに保存される
    • システム環境変数: HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager\Environment\以下の環境変数名の項目
    • ユーザ環境変数: HKEY_CURRENT_USER\Environment\以下の環境変数名の項目
ユーザ環境変数のTEMPTMPを変更するレジストリファイルの例
REGEDIT4

[HKEY_CURRENT_USER\Environment]
"TEMP"="Z:\\path\\to\\tempdir"
"TMP"="Z:\\path\\to\\tempdir"

一時フォルダの場所をtmpfsのディレクトリに指定すると、一時ファイルのアクセスが高速になってストレージへの書き込みも抑えられる。

環境変数表示のテストプログラム

引数に任意の数の環境変数名を指定して実行する。

[任意]ファイル名:getenvtest.c ライセンス:CC0
#include <stdio.h>
#include <stdlib.h>

/*
 *  引数に指定した環境変数を表示するテスト
 *  CC0
 *
 *  x86_64-w64-mingw32-gcc -O2 -Wall -Wextra getenvtest.c -o getenvtest.exe
 *  i686-w64-mingw32-gcc -O2 -Wall -Wextra getenvtest.c -o getenvtest.exe
 */

int
main(int argc, char **argv)
{
    int i;
    char *name, *val;
    for (i = 1; i < argc; i++)
    {
        name = argv[i];
        val = getenv(name);
        printf("%s: %s\n", name, (val != NULL) ? val : "(undefined)");
    }
    return EXIT_SUCCESS;
}
実行例
$ wine /path/to/getenvtest.exe LANG TEMP PATH FOOBAR
LANG: ja_JP.UTF-8
TEMP: C:\users\username\Temp
PATH: C:\windows\system32;C:\windows;C:\windows\system32\wbem;C:\windows\system32\WindowsPowershell\v1.0
FOOBAR: (undefined)