说实话,当我第一次看到这个问题时,我认为这个问题很容易回答。哦,我错了。它的工作原理有很多细微差别。
不过,让我们从相当“简单”的部分开始。第一种方法和第二种方法的主要区别:
-
wsl
本身启动到登录(和交互式)shell
- shell 启动了
wsl echo $PATH
既不是登录 shell,也不是交互式 shell
因此,第一个将获取两个登录脚本(例如~/.profile
)和交互式启动脚本(例如~/.bashrc
)。第二种形式无法获取其中任何一个的来源。
您可以使用以下命令以不同的方式查看此问题(并找到解决方案):
wsl -e bash -c 'echo $PATH'
wsl -e bash -li -c 'echo $PATH'
The -li
强制 bash 作为登录和交互式 shell 运行,从而获取所有适用的启动脚本。并且,正如 @bovquier 在评论中指出的那样,此处需要单引号以防止 PowerShell 插入$
在到达 Bash 之前。那,或者逃避它。
您应该能够以相同的方式运行 TeX Live,只需将“echo $PATH”替换为 TeX Live 所需的启动命令即可。
第二个选项是创建一个既添加路径又运行命令的脚本,然后通过以下方式启动该脚本wsl /path/to/script.sh
也就是说,老实说,我不认为您当前的登录/交互式路径来自/etc/environment
。至少在我的测试中,/etc/environment
在 WSL 中没有用处,这是可以预料的。/etc/environment
仅由 PAM 模块提供来源,并且 WSL 不执行登录检查,因此没有理由在中调用 PAMeither the wsl
也不wsl echo $PATH
命令。
我希望你仍然有 PATH 设置~/.bashrc
或类似的地方),这就是 shell 目前正在从中获取它的地方。
虽然这对于理解答案并不一定重要,但您可能还会想,如果/etc/environment
不用于设置 WSL 中的默认(非登录、非交互)路径,什么是?答案似乎是它被硬编码到init
启动 WSL。那init
也是附加 Windows 路径的内容(假设您没有在/etc/wsl.conf
).