いさぽん部屋(isapon.com)

ゲーム系プログラマによる特に方針のないブログ。技術系とカレー、ラーメンネタ多めだったはずが、最近はダイエットネタ多め。

WSLの中で暮らすためのメモ

Windows10 RS4 アップデートで、WSL周りがかなり使いやすくなった。以前よりもさらにWSLとWindows間での連携がやりやすくなっています。


そんなわけで、WSLのメモ。


ちなみに、ターミナルエミュレータなどを使わずに、使い勝手がいいとは言えないが標準のDOS窓を使うのがトラブルが少なくてよい。

WSL(bash.exe)を起動する

起動時に、~ を引数として渡しておくと、ホームディレクトリから始まるので使いやすい。

C:\Windows\System32\bash.exe ~

WSLからバッチファイルを実行する。

cmd.exe に /c オプションを渡します。パスを指定するときはWindowsからパスで指定します。

cmd.exe /c c:\hoge\fuga.bat

バッチファイルをcmd.exeを指定せずに起動できるようにする。

binfmtで登録しておきます。

sudo sh -c "echo :WindowsBatch:E::bat::/init: > /proc/sys/fs/binfmt_misc/register"
sudo sh -c "echo :WindowsCmd:E::cmd::/init: > /proc/sys/fs/binfmt_misc/register"

WSLのファイルをWINDOWS側のパスに変換する

/bin/wslpath コマンドを使うとよい。aコマンドを外すと相対パスになります。wではなく、uを渡すとWSL内のパスになります。 w(indows), u(nix) と覚えるよいいかも?


$ /mnt/c/hoge/fuga
$ slpath -aw  foo.bar.txt
c:\hoge\fuga\foo.bar.txt

参考 wslpath has no "usage" or "help" information · Issue #2715 · Microsoft/WSL · GitHub

WSLからWindowsの実行ファイルを実行してみる

拡張子の .exe を忘れなければOK。

hoge.exe

ただし、これだと hoge.exe が終了するまでコンソールに戻ってこないのでGUIアプリの場合はバックグラウンド実行するとよい。やりかたは、コマンドの最後に & をつけるだけ。

hoge.exe &

試しにWSLからAndroidアプリをビルドしてみる。

※binfmtで.batを登録済み

cd /mnt/d/myproj
(cd android && ./gradlew.bat installDebug)

試しにWSLからVisualStudioのプロジェクトをビルドしてみる。

alias msbuild="/mnt/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio/2017/Community/MSBuild/15.0/Bin/MSBuild.exe"
cd /mnt/d/myproj/
(cd vcprj && msbuild)

WindowsからWSL内のファイルを操作する(今のところ禁止)

Windows10RS4の段階では、Windows側から直接操作してはいけません。というのも、Linuxのファイルシステムにはパーミッションだったり、ファイル名の大文字小文字の区別など、Windows(というかNTFS)のファイルシステムにはない情報が必要なため、VolFSというシステムを用いて裏でいろいろと行っています。 Windowsからファイルを操作するとこのVolFSとの情報にズレが出るため、おかしなことになります。


Microsoft Store からWSLをインストールした場合以下の場所に入っています。

C:\Users\USERNAME\AppData\Local\Packages\PACKAGENAME\LocalState\rootfs

※将来的にはWindowsからも気にせず操作できるようになるといいのになぁ。