LoginSignup
2
1

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-07-24

困ったこと

  • 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に標準でインストールされたもの)
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1