VSCodeのWSLターミナルでbrewが使えないときの対処方法


困ったこと

  • VSCodeでwslのターミナルを起動したときに、brewと、brewで入れたコマンドが使えない。

  • 以下のようにコマンドが見つからないといわれてしまう。

$ brew

Command 'brew' not found, did you mean:

  command 'brec' from deb bplay (0.991-10build1)
  command 'qbrew' from deb qbrew (0.4.1-8build1)

Try: sudo apt install <deb name>
  • brew経由でインストールしたコマンドも同様に見つからない。(以下はkubectlの場合)
$ kubectl
kubectl: command not found
  • 一方で、windows terminalからwslを実行した場合にはbrewコマンドと、brew経由でインストールしたコマンドが実行できる。

解決方法

  • 以下のコマンドで、~/.profileではなく~/.bashrcにbrewのパスを書く。
    • zshの場合は~/.bashrc -> ~/.zshrcに置き換えて実行してください。
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.bashrc

どうしてbrewが使えなかったのか

そもそもlinuxbrewってなに?

  • mac OSで使用できるパッケージマネージャであるhomebrewには、linuxbrewというlinux向けのバージョンが存在します。

  • wslでも以下のページに従ってインストールすることで使用できます。

  • macOSと同じターミナル環境をlinuxサーバーやwslでも作りたいとき、aptやyumレポジトリが存在せずbrewでしか提供されていないコマンドをインストールしたいときに便利です。

状況の確認

  • 冒頭でも書いたように、VSCode上でwslのターミナルを開いたときにはbrew関連のコマンドが実行できません。
  • 一方で、Windows TerminalやWSLの標準のターミナル(WindowsのスタートメニューからUbuntuを実行したときに開かれるもの)ではbrewコマンドが実行できます。

  • VSCodeのターミナルの場合

$ brew

Command 'brew' not found, did you mean:

  command 'brec' from deb bplay (0.991-10build1)
  command 'qbrew' from deb qbrew (0.4.1-8build1)

Try: sudo apt install <deb name>
  • それ以外の場合
$ brew
Example usage:
  brew search TEXT|/REGEX/
  brew info [FORMULA|CASK...]
  brew install FORMULA|CASK...
  brew update
  brew upgrade [FORMULA|CASK...]

...

パスの比較

  • たぶんPATHが通ってないんだろう、ということで両者でPATHを比較してみます。

  • 以下のコマンドをVSCode側で実行

$ echo ${PATH//:/\\n} > VSCode.txt
  • 次はWindows Terminal側でこのコマンドを実行
$ echo ${PATH//:/\\n} > WinTerminal.txt
  • 両者をdiffコマンドで比べてみると、VSCodeのターミナルにはやはりbrewのパスが存在しません。
    • ということで、これはパスが通っていないのが原因みたいです。
diff WinTerminal.txt VSCode.txt
2,3d1
< /home/linuxbrew/.linuxbrew/bin
< /home/linuxbrew/.linuxbrew/sbin

解決

  • linuxbrewのパスは.profileに書かれています。これはlinuxbrewのインストール時に以下のコマンドを実行して.profileにパスを書くように指示されるためです。
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.profile
  • 自分のターミナル環境では.profileにはlinuxbrewのパスしか書かれていませんでした。

    • 先ほどのパスの比較ではlinuxbrewのパスだけが抜けていたので、どうやら.profileにパスが書かれていることが問題のようです。
  • ということで、.profileではなく.bashrcにlinuxbrewのパスを書いてみたところ、VSCodeでもbrewが実行できるようになりました。

$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.bashrc

.profile.bashrcについて

  • .profile.bashrcはどちらもコマンドのパスやターミナル起動時に実行したいコマンドを記述しておくファイルです。
  • どうして.profile.bashrcで違いがでるのか、それは両者の読み込まれるタイミングの違いにあります。

  • 以下の記事にあるように、.profileはログイン時に実行されるの対して、.bashrcはbashが起動するたびに実行されます。

  • おそらく、VSCodeのターミナルではログイン処理が実行されない(?)のが原因で.profileが読み込まれないのではないでしょうか。

    • (注意)完全に推測です。

zshの場合

  • zshの場合は.zprofileではなく、.zshrcにlinuxbrewのパスを書き込む必要があります。
$ echo 'eval $(/home/linuxbrew/.linuxbrew/bin/brew shellenv)' >> ~/.zshrc

検証環境

  • OS: windows10(21H1)
  • VSCode: Version 1.58.2 (June 2021)
  • WSL: ubuntu 20.04, WSL2
  • Windows Terminal:
  • Shell:
    • zsh(linuxbrewでインストールしたもの)
    • bash(ubuntuに標準でインストールされたもの)