実録コンピュータ物語

趣味で使っているコンピュータ&アプリの情報を発信するブログです。

Windows上のVSCode + Code RunnerでWSLのコマンドを実行する

Visual Studio CodeCode Runner拡張機能Windows側から WSL(Windows Subsystem for Linux)のコマンドを実行する設定方法です。

実行環境

設定方法その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上で実行されている事がわかります。

f:id:bosh:20190609152116p:plain
WSL上のperlが実行された

補足

ちなみに単純化して以下のようにしても、パスがWindowsのフォーマットで渡されるため動作しません。これを避けるために上記の設定ではcd $dirを入れてカレントディレクトリを移動し、ファイルのフルパスを渡さないようにしています。

{
    "code-runner.executorMap": {
        # 動作しない
        "perl": "wsl perl"
    },
}

f:id:bosh:20190609153116p:plain
パスのフォーマットがWindowsのままなので実行に失敗する

設定方法その2 - wslpathを使用

最初の設定では「wsl.exeは実行時のカレントディレクトリをそのまま引き継ぐ」ということを利用してcd $dirを入れていました。もう1つ、wslpathを使ってきちんとパスを変換する方法もあります。

{
    "code-runner.executorMap": {
        "perl": "bash -c \"perl $(wslpath $fullFileName)\""
    },
}

この場合のbashLinux上ではなく、WSLをセットアップするとインストールされるbash.exeが実行されます。-cオプションのコマンドはWSL上で実行されるので、Code Runnerのパラメータである$fullFileNamewslpathでWSLフォーマットに変換すればいいということになります。カレントディレクトリを変更しないという点では、こちらの方が本来の動作に近いと言えます。

ただし、このパスの途中に空白を含むファイルは実行できません。「方法その1」のcd $dir方式では問題なく実行できます。

f:id:bosh:20190609160225p:plain
wslpathでパスを変換して実行

設定方法その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%' )'\""
    },
}