2017年12月11日
MSYS2上からWSL内のファイルを実行する方法
Windows 10 Fall Creators Update から WSL (Windows Subsystem for Linux) が使用できるようになり、Windows で Ubuntu 等の Linux バイナリが実行できるようになり、非常に便利です。
諸事情により、MSYS2 上から WSL 内の実行ファイルを実行したい場合に、MSYS2 はコマンドライン文字列中のファイルパスを勝手に変換してしまうため、正しく wsl コマンド経由で WSL 内部のファイルにアクセスすることができなくて悩んだので、その解決策のメモです。
諸事情により、MSYS2 上から WSL 内の実行ファイルを実行したい場合に、MSYS2 はコマンドライン文字列中のファイルパスを勝手に変換してしまうため、正しく wsl コマンド経由で WSL 内部のファイルにアクセスすることができなくて悩んだので、その解決策のメモです。
WSL にインストールした Ubuntu 上で、/home/kmc/test で、以下のような実行ファイルを作ったとします。
これで目的は達成できたのですが、MSYS2 上から wsl コマンドを実行すると、プログラムが終了しても Enter キーを押すまで制御が MSYS2 コンソール (mintty) に戻ってこないのが気になっています。
追記(2017/12/13):セミコロンで繋げた次のコマンドが実行されず、実害が出てきてしまったので少し真面目に調べた所、これはどうも mintty (2.8.1 x86_64-pc-msys) が原因のようです。C:\msys64\msys2_shell.cmd -defterm のショートカットから起動して(mintty ではなく、その)コマンドプロンプト上で実行するならば問題無いようです。(Windows 10 の新しいコマンドプロンプトで確認)
参考:https://github.com/msys2/msys2/wiki/Porting
$ pwd /home/kmc/test $ cat hello.c #include <stdio.h> int main(int argc, char *argv[]) { printf("hello, WSL!\n"); return 0; } $ gcc -Wall hello.c $ ./a.out hello, WSL!この a.out を MSYS2 上で実行したい場合、以下のように素直に書くだけでは上手く行きません。
$ wsl /home/kmc/test/a.out /bin/bash: C:/msys64/home/kmc/test/a.out: No such file or directoryそこで、MSYS2 のファイルパス変換を抑制する MSYS2_ARG_CONV_EXCL 環境変数を使用します。環境変数に指定した文字列にマッチするファイルパスの変換が抑制されます。複数指定したい場合は、セミコロン区切りとなります。
$ MSYS2_ARG_CONV_EXCL='/home/kmc' wsl /home/kmc/test/a.out hello, WSL!無事に実行できました。全ての変換を無効にしたい場合は '*' のようにワイルドカードで指定すれば良さそうです。
これで目的は達成できたのですが、MSYS2 上から wsl コマンドを実行すると、プログラムが終了しても Enter キーを押すまで制御が MSYS2 コンソール (mintty) に戻ってこないのが気になっています。
追記(2017/12/13):セミコロンで繋げた次のコマンドが実行されず、実害が出てきてしまったので少し真面目に調べた所、これはどうも mintty (2.8.1 x86_64-pc-msys) が原因のようです。C:\msys64\msys2_shell.cmd -defterm のショートカットから起動して(mintty ではなく、その)コマンドプロンプト上で実行するならば問題無いようです。(Windows 10 の新しいコマンドプロンプトで確認)
参考:https://github.com/msys2/msys2/wiki/Porting