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にも同じコマンドが書かれているので、そこも同様に書き換える。
なお、前述のとおり、わざわざそのような構成になっている理由はわからないので、不具合が出たらすみません。