Windows上のVSCode + Code RunnerでWSLのコマンドを実行する
Visual Studio CodeのCode Runner拡張機能でWindows側から WSL(Windows Subsystem for Linux)のコマンドを実行する設定方法です。
実行環境
- Visual Studio Code自体はWindows 10で実行
- Code Runnerでコードを実行する際、WindowsではなくWSL上のコマンドを実行する
- WSLのLinuxはPengwinを使用
設定方法その1 - カレントディレクトリを移動して実行
例としてWSLのperlを実行するようにします。Visual Studio Codeのユーザー設定(settings.json)に以下のように入力します。WSLのコマンドの呼び方は 「Windows 10のコマンドプロンプトからWSL上のLinuxコマンドを呼び出す(バージョン1803対応版):Tech TIPS - @IT」が詳しいです。
{ "code-runner.executorMap": { "perl": "cd $dir && wsl perl $fileName" }, }
試しに実行中のOSを出力するperlスクリプトを実行してみます。Windows版のperlだと「MSWin32」となる所が「linux」になり、WSL上で実行されている事がわかります。
補足
ちなみに単純化して以下のようにしても、パスがWindowsのフォーマットで渡されるため動作しません。これを避けるために上記の設定ではcd $dir
を入れてカレントディレクトリを移動し、ファイルのフルパスを渡さないようにしています。
{ "code-runner.executorMap": { # 動作しない "perl": "wsl perl" }, }
設定方法その2 - wslpathを使用
最初の設定では「wsl.exe
は実行時のカレントディレクトリをそのまま引き継ぐ」ということを利用してcd $dir
を入れていました。もう1つ、wslpath
を使ってきちんとパスを変換する方法もあります。
{ "code-runner.executorMap": { "perl": "bash -c \"perl $(wslpath $fullFileName)\"" }, }
この場合のbash
はLinux上ではなく、WSLをセットアップするとインストールされるbash.exe
が実行されます。-c
オプションのコマンドはWSL上で実行されるので、Code Runnerのパラメータである$fullFileName
をwslpath
でWSLフォーマットに変換すればいいということになります。カレントディレクトリを変更しないという点では、こちらの方が本来の動作に近いと言えます。
ただし、このパスの途中に空白を含むファイルは実行できません。「方法その1」のcd $dir
方式では問題なく実行できます。
設定方法その3 - 自力でWSLのパスに変換
パスに空白文字が含まれていても動作するように改良したバージョンです。sedでバックスラッシュをスラッシュに置換→ドライブレター(C:
など)を/mnt/c
に置換→シングルクオートで囲む、という処理を行っています。エスケープシーケンスが多すぎて分かりづらくなってしまいました。
{ "code-runner.executorMap": { "perl": "bash -c \"perl '$( echo $fullFileName | sed 's%\\\\%/%g' | sed 's%^\\([a-zA-Z]\\):%/mnt/\\L\\1%' )'\"" }, }