WSL环境变量过长导致程序运行缓慢的解决方法

起因

最近使用WSL2折腾linux命令行的软件,在使用thefuck(一个自动修正上一个错误命令的软件)的时候,发现输入fuck 的时候,需要等很长的一段时间…

经过搜索,发现是因为WSL默认是把Windows的系统PATH环境变量加入到Linux里面了,导致每次运行命令时要遍历linux和windows的PATH,能不慢么 …

不信你可以cat $PATH试试🤣

于是乎又去各种地方寻找解决方案,总结一下两种:

解决方案1 : WSL全局忽略Windows PATH变量

Windows 17093 之后的版本

修改/etc/wsl.conf

添加上:

1
2
[interop]
appendWindowsPath = false

重新进入WSL;

然后输入 cat $PATH

如果Windows的PATH变量还存在的话,那在PowerShell里输入:

Restart-Service LxssManager

或者

1
2
wsl.exe --list
wsl.exe --terminate <distro_name>

(前一个命令用来显示wsl的distro_name )

这个解决方案算不上好,因为去掉了win的环境变量的话,windows上很多与WSL互联的应用都会失效(比如VSCode的远程连接WSL)。

但是它的适用范围更广,无论是哪个需要用到path的软件,都可以加快速度,一劳永逸。

想要添加回来的话就把false改成true 然后重复操作就行了

全版本适用(大概)

在你的shell的run commands文件(如.bashrc)中添上以下命令:

1
PATH=$(/usr/bin/printenv PATH | /usr/bin/perl -ne 'print join(":", grep { !/\/mnt\/[a-z]/ } split(/:/));')

然后source 你的rc文件

从而在每次启动shell时将win的path去除;

重启wsl即可。

解决方案2 : 通过软件自身设置忽略Win环境变量

这个解决方案最好,但我把它放第二个是因为不是每个软件都会专门为wsl这一特性做优化

就拿thefuck这个软件来举例:

有人在作者github repo的issue里提到了等待时间过长这个问题

于是乎作者在某个版本将忽略路径这一功能加上了,还在Wiki给出了解决方法

由于软件解决这一问题的方法不统一,所以只能自行到软件的Wiki/Github寻找WSL关键字或者StackOverflow走起😑

吐槽

WSL2我只能说又爱又恨;

一方面它和Windows融合,比双系统体验好很多;

另一方面微软又总喜欢搞些特殊,总会有这样那样的问题,只能说爱折腾才会去用WSL2🙄