linux

【WSL2】VSCodeを開いたときにwhichエラーが発生するのを防ぐ方法

Windows環境で手軽にlinuxを使用できる機能のWSL2

今回はWSLでVSCodeを開いたときにwhichエラーが出るのを防ぐ方法について解説します。

今回の記事の対象はこちらの方

  • WSL経由でVSCodeを開き、ターミナルを起動するとwhichエラーがでる

具体的には以下のようになります

ターミナル自体は問題なく使えますが、毎回出るのをなんとかしたい。

ということで解決策がないか調べてみました。

which エラー現象をなくすには?

結論だけ先に書いておきます。

~/.bashrcに以下を記載するだけです。

unset -f which

記載したら、source ~/.bashrc するかターミナルを再起動すればOKです。

これで次回以降whichエラー現象が発生しなくなります。

原因を調べてみた

調べてみるとあるサイトにたどり着きました。

https://github.com/lensapp/lens/issues/111

こちらのgithub issuesはLens(レンズ)と呼ばれる Kubernetes クラスタの運用管理ツールの質問です。

こちらの質問内容が今回の求めている回答に非常に近かったです。

質問内容を略すと以下の感じ

Kontena Lens ダッシュボードから任意の機能を実行すると、次の行でエラー プロンプトが発生します。

エラーはダッシュボードの機能的な動作には影響しませんが毎回出るのは勘弁してほしい。

それに対する回答はこちら(Google翻訳)

問題はシェル環境の同期です。bash では、変数名がBASH_FUNCで始まる環境で関数が定義されます。

一般的な環境変数とは異なり、複数行の値があります。これらの環境変数によ環境がターミナル用に再構築されるときに、キャプチャされた値の最初の行からのみこれらの変数を再作成しようとしているように見えるため、予期しないファイル終了メッセージが表示されます。

コードでこれに対処するには、いくつかの方法があります。1 つは、単に変数を環境同期から除外することです。もう 1 つは、これらの変数の複数行の値を処理できるようにコードを修正することです。

もう少し噛み砕くなら

環境変数にファンクションが定義されているとターミナル立ち上げ時にエラーになる。

だから、環境変数に定義されているファンクションを外せばよい

となります。

実際にenvコマンドを叩いて環境変数を確認しています。

$ env | grep which

BASH_FUNC_which%%=() {  ( alias;
which_declare=declare -f
BASH_FUNC_which%%=() {  ( alias;
 eval ${which_declare} ) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot "$@"

上記のようにファンクションが定義されていることがわかります。

これを解除するためには結論で書いたように~/.bashrcに環境変数の解除を書けばよいです。

# vscodeでwhichエラーを防ぐためファンクションを解除
unset -f which

以上を記述した上で、再度ターミナルを起ち上げるとwhichエラーが解消されているはずです。

まとめ

今回はWSL経由でVSCodeを起動するとwhichエラーが出る解決策をまとめました。

まとめです。

  • whichエラーがでるのは環境変数にファンクションが定義されているから
  • 解決するためには~/.bashrcにunset -f which を記述する。
  • 記述後はターミナルを再立ち上げする

以上になります。