本文介绍了通过WSL[COMMAND]&QOOT;调用命令与打开WSL外壳并调用&QOOT;[COMMAND]&QOOT;有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Windows 10上通过WSL 2.0使用Ubuntu,并希望从Windows命令行运行tex live。为此,我将tex live文件夹添加到/etc/environment中的路径(我还尝试了许多其他位置,例如。$HOME/.bashrc):

C:UsersscottDocuments>wsl echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Windows/system32:...

C:UsersscottDocuments>wsl
scott@SCOTT-PC:/mnt/c/Users/scott/Documents$ echo $PATH
/usr/local/texlive/2020/bin/x86_64-linux:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Windows/system32:...

为什么这两条路径会有差异?是否可以更改第一个路径变量?

推荐答案

老实说,当我第一次看这个问题时,我认为它会是一个简单的答案。我大错特错了。它的工作原理有很多细微差别。

不过,让我们从相当容易的部分开始。第一种方法和第二种方法的主要区别:

  • wsl本身启动到登录(和交互)外壳
  • 使用wsl echo $PATH启动的外壳既不是登录外壳,也不是交互外壳

因此,第一个将同时生成登录脚本(例如~/.profile)和交互式启动脚本(例如~/.bashrc)。第二个表单无法获取这两个来源中的任何一个。

您可以通过以下命令以不同的方式看到这一点(并获得解决方案):

  • wsl -e bash -c 'echo $PATH'
  • wsl -e bash -li -c 'echo $PATH'

-li强制bash作为登录和交互外壳运行,从而获取所有适用的启动脚本。而且,正如@bovquier在评论中指出的那样,这里需要一个单引号,以防止PowerShell在Bash之前插入$。或者逃脱它。

您应该能够以相同的方式运行Tex Live,只需将";ECHO$PATH&qot;替换为Tex Live所需的启动命令。

第二个选项是创建既添加路径又运行命令的脚本,然后通过wsl /path/to/script.sh

启动该脚本也就是说,我真的不认为您当前的登录/交互路径来自/etc/environment。至少在我的测试中,/etc/environment在WSL中没有用处,这是意料之中的。/etc/environment仅源自PAM模块,并且没有由WSL执行登录检查,因此没有理由在wslwsl echo $PATH命令中调用PAM。

我希望您在~/.bashrc或类似的位置中仍有路径设置),而这就是外壳程序当前获取它的位置。

虽然这不一定是理解答案的关键,但您可能还想知道,如果/etc/environment不用于在WSL中设置默认(非登录、非交互)路径,那么什么才是呢?答案似乎是它被硬编码到启动WSL的init中。该init也是附加Windows路径的内容(假设您没有在/etc/wsl.conf中禁用该功能)。

这篇关于通过WSL[COMMAND]&QOOT;调用命令与打开WSL外壳并调用&QOOT;[COMMAND]&QOOT;有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-15 03:06