Edited at

VS Code on Windows10の統合ターミナルからRuby on WSL(Ubuntu 18.04)を開けなかった

More than 1 year has passed since last update.


概要


  • Windows 10上のVS Codeの統合ターミナル(wsl)で、WSL(Ubuntu 18.04)上にインストールしたrubyを呼び出そうとしたところ、コマンドが見つからず実行できなかった。


    • ただし、WindowsアプリからUbuntu 18.04のターミナルを開いたときは正しくrubyコマンドが使える。



  • 原因はWSLの既定ディストリビューションがLegacyになっていたせいだった。wslconfigで既定ディストリビューションを変更したら解決した。


やりたかったこと


  • WindowsとWSL Ubuntuで別々にRubyをインストールしたくない。

  • Windows上でRubyのバージョン管理をするのは何かと面倒なので、WSL Ubuntu上でrbenvを使って管理したい。

  • VS CodeはWindowsから起動したいが、統合ターミナルはwslを使いたい。

  • 起動時の統合ターミナルのカレントディレクトリはVS Codeで開いているディレクトリにしてほしい。


困ったときの環境


  • OSはWindows 10 Home。最初期のバージョン10.0から使い始め、2018年8月25日現在のバージョンは最新の1803だった。

  • 過去、バージョン1703のときにbeta版のWSL (Bash on Ubuntu on Windows)をインストールしていた。

  • 今回新たにバージョン1803でWindowsストアからUbuntu 18.04をインストールした。

  • このUbuntu 18.04上で、rbenvを使ってrubyをインストールした。


    • このときruby -vできちんとパスが通っていることを確認した。



  • その後、Windows上で別途VS Code(バージョン1.26.1)をインストールした。


  • 既定のシェルの選択でwslを選択した。(デフォルトはpowershellだったと思う)

  • 再起動し、統合ターミナルからruby -vしたらruby: コマンドが見つかりません。なんで!?


解決

コマンドプロンプトからwslconfigで既定のWSLディストリビューションを調べたところ、以下のようにLegacyが既定になっていた。

> wslconfig /l /all

Windows Subsystem for Linux ディストリビューション:
Legacy (既定)
Ubuntu-18.04

以下のコマンドを実行し、既定のディストリビューションを変更した。

> wslconfig /setdefault Ubuntu-18.04


> wslconfig /l /all
Windows Subsystem for Linux ディストリビューション:
Ubuntu-18.04 (既定)
Legacy

引用元:https://linuxfan.info/wslconfig

VS Code上でTerminal: Select Default Shellからwslを選択した。これにより以下の記述がユーザー設定に追加された。


settings.json

{

"terminal.integrated.shell.windows": "C:\\WINDOWS\\System32\\wsl.exe",
}

最後にVS Codeを再起動して統合ターミナルを開くと、Ubuntu 18.04の環境に導入しておいたrubyを動かせた。やったぜ。

$ pwd

/mnt/c/Users/asami/workspace
$ ls
hello.rb
$ ruby -v
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ ruby hello.rb
Hello world!


解決に至るまでに調べたこと


  • VS Code (バージョン1.26.1)ではデフォルトで以下の4つが選べるようだ。


    • Command Prompt

    • Windows PowerShell

    • Git Bash

    • WSL Bash



  • このうちのWSL Bashはインストールしている既定のWSLのshellを使うらしい。(参考)

  • インストールしているアプリ版のWSLはC:\\Users\\<ユーザ名>\\AppData\\Local\\Microsoft\\WindowsApps\\<WSLバイナリ名>.exeに存在する。(参考)


    • ただし、アプリ版WSLのバイナリを直接指定した場合、統合ターミナルを開いたときのカレントディレクトリがホームに固定されてしまうようだ。



  • 私のように「開発環境(コンパイラなど)はWSLで、エディタやファイル管理はWindowsで」と使い分けたい場合、既定としたいWSLに標準shellを含めた環境設定を行った上で、VS Codeの統合ターミナルのシェルにwsl.exeを選択すればよい。

  • wslに関する設定はCommand PromptまたはWindows PowerShellから行う。具体的にはwslconfigを使う。


まとめ

LegacyなBash on Ubuntu on Windowsはトラブルのもとになるので、普通に使うなら設定等をアプリ版に移行した上で削除してしまったほうがよさそう。

削除はwslconfig /u <ディストリビューション名>。(あっさり全消しされるので実行時は要注意)


参考