🍣

【Unity】macOS の Process.Start() で PATH 探索を効かせる

に公開

小ネタです。

macOS の Unity エディタでは、(明示的にCLIから起動しない限り)シェルで使えるものとは異なる PATH が設定されています。

Debug.Log(Environment.GetEnvironmentVariable("PATH"));
// Output: /usr/bin:/bin:/usr/sbin:/sbin

これは Unity というより macOS の GUI アプリケーション共通の挙動であるようです。

なんにせよ、この状態の Unity エディタで Process.Start() しようとするとうまく PATH の探索が効きません。これは外部の CLI ツールなどを利用する際に困ります。

Process.Start("dotnet", "hoge.exe"); // Win32Exception

回避策

PATH が設定された状態のシェルを経由することで回避できます。

Process.Start("/bin/bash", $"-cl '{command}'");

-c は後に指定したコマンドを実行するオプションで、-lはログインシェルかのように振る舞うオプションです。bash はログイン時に読み込むプロファイルで PATH の設定を行うので、この状態なら通常と同様の PATH を利用することができます。この方法は UseShellExecute = false でも動くので、シェルを使いつつ標準出力をリダイレクトする用途にも使えます。

ついでにクロスプラットフォーム対応してあげましょう。

Process.Start(
#if UNITY_EDITOR_WIN
    command, args
#else
    "/bin/bash", $"-cl '{command} {args}'"
#endif
);

以上です!

Discussion