C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

WSL の内側の世界から、外側の Windows の世界の PATH が "何もしていないのに" 通っている件、をどうにかしたい場合のメモ

WSLの内側の世界では、外側の世界の Windows で実行可能なバイナリー「も」実行できます。

実際この機能はしばしば便利な事もあります。例えば、

  • 諸事情によりWSLの内側の世界で作業中に
  • PE32+ (†1) なバイナリーファイルを
  • nm (†2) したいけど ELF (†3) じゃないのでもちろんできないので
  • 仕方がないので dumpbin (†4) しなければならないが
  • わざわざWSLの外側の世界で cmdpowershell で実行するのは面倒 (†5)

みたいな事が起こるユーザーにはとても便利です。 PATH 通すか aliasfunction で呼べるようにしておけばね💪

そういうわけで PATH の話に無理やり繋げました。 WSL の内側の世界では Windows (のWSLの仕組み) が "気の利かせ" て Windows の世界の PATH を WSL の内側の Linux の世界へ全自動デフォルトで注入してくれます。野暮なお節介ババア的な感じで。すごくいい人だけどいい人すぎて余計なお世話のトラブルメーカー的な。

つまりこういう事が起こる:

  1. WSL の内側の世界でプラットフォームのパッケージマネージャーを介して yarn を入れてあるとしましょう:
  << which yarn
/sbin/yarn
  1. その yarnglobal bin 置き場は default な具合でこうなっていて、なにか適当なアプリが入っていたとしましょう (↓の例では neon; 例なのでなんでもいいです ):
  << yarn global bin --offline
/home/usagi/.yarn/bin

  << ll $(yarn global bin --offline)
total 8.0K
drwxr-xr-x 2 usagi usagi 4.0K 2020-03-22T13:20:24 ./
drwxr-xr-x 3 usagi usagi 4.0K 2020-03-20T22:04:21 ../
lrwxrwxrwx 1 usagi usagi   48 2020-03-22T13:20:24 neon -> ../../.config/yarn/global/node_modules/.bin/neon
  1. ところがこの yarn を介して導入したはずのアプリを実行すると何か奇妙な現象に見舞われて、原因を探るためにまず which とか readlink とか headhexdump
  << which neon
/mnt/c/Users/usagi/AppData/Local/Yarn/bin/neon

/(^o^)\

みたいな事が起こります。起こりました。単独で他のファイルに絡まずに実行可能なスクリプトでは実害のある問題は起こらない事もありますが、そうではない場合はわりと危険が危ないです。これについて、ぱわーのあるユーザーなら PATH について .zshrc 的ないつものところへ PATH=$( 💪 MY AWESOME BLACK MAGIC BE DESTROY AUNT MEDDLESOME WINDOWS GIVEN HOLY PATH 💪 ) みたいなみなぎる筋肉をぶつけていくスタイルでマッチョに解決していた時代も実際あったようです。 perl でも php でも awk でも python であれ、何か得意な黒魔術で対処療法の時代。

現在は既に対処療法ではなく遺伝子操作やワクチンによる解決が実用可能になっていて:

WSL 内へ摂取する"ワクチン的"でお手軽な方法として:

  1. /etc/wsl.conf を書く:
[Interop]
appendWindowsPath = False
  1. 管理者権限の powershellRestart-Service LxssManager しておく ( 全ての WSL 環境は安全に閉じてから↑の設定後に1回する )

f:id:USAGI-WRP:20200322150610p:plain

これだけでよくなったようです。🎉

f:id:USAGI-WRP:20200322150804p:plain

外の世界の Windows のお節介による PATH が消えたので先の例の WSL 内 yarn を介して導入した neonwhich でも確認できるようになりました。 yarn だけなら💪的に export PATH="$(yarn global bin --offline):$PATH" だけでも事実上は解決できるのだけど、それだけ、という事ではなく解消しておきたい場合には一般的に WSL のお節介機能を無効化するのが安全です。

"遺伝子操作"的なやつがお好みの場合は regedit して HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss のなかをもぞもぞする方法もあるようです。私は楽にすませたいので /etc/wsl.conf したのでこちらは試しませんでしたけれど。