🍣
【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