WSLとWindows両方にpyenv(windowsはpyenv-win)をインストールすると、WSLでpyenvが使えなくなる。
WSLの起動時に
/mnt/c/users/hogeuser/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not found
のようなエラーメッセージが表示される。
これは、~/.bashrc
でpyenvのPATHを通そうとする際に、
command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
このように設計されているためである。
(なぜかはわからない)
このコマンドの内容は、
command -v pyenv >/dev/null
でpyenvというコマンドが存在するかを確認し、存在する場合は何もせず、存在しない場合、export PATH="$PYENV_ROOT/bin:$PATH"
でパスを通す、というものです。
通常、パスを通す前はpyenv
コマンドは存在しないので、前者のコマンドは常にFalse-likeとなり、常に後者のコマンドが実行され、パスが通される。
しかし、WSLの場合、Windowsのコマンドを実行することができる(Windowsのパスも参照できる)。
そのため、Windowsにpyenv
が存在する場合、前者のコマンドはTrue-like(コマンドのフルパスが返ってくる)になるので、後者のパスを通すコマンドが実行されない。
結果、pyenv
を実行するとWindows上のものが実行され、エラーが発生する。
なお、起動時のエラー/mnt/c/users/hogeuser/.pyenv/pyenv-win/bin/pyenv: 3: cygpath: not found
などは、command -v pyenv >/dev/null
の段階でWindows上のpyenv
をLinuxから実行したことで発生している。
Windowsのpyenv
では、Windowsのコマンドcygpath
などを実行しようとするが、Linuxから実行されているので見つからずに上のエラーが発生する。
解決策
~/.bashrc
のcommand -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"
の条件部分を消し、単にexport PATH="$PYENV_ROOT/bin:$PATH"
とする。
pyenvの公式手順通りにインストールした場合は、~/.profile
にも同じコマンドが書かれているので、そこも同様に書き換える。
なお、前述のとおり、わざわざそのような構成になっている理由はわからないので、不具合が出たらすみません。