本文介绍了通过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执行登录检查,因此没有理由在wsl
或wsl echo $PATH
命令中调用PAM。我希望您在~/.bashrc
或类似的位置中仍有路径设置),而这就是外壳程序当前获取它的位置。
/etc/environment
不用于在WSL中设置默认(非登录、非交互)路径,那么什么才是呢?答案似乎是它被硬编码到启动WSL的init
中。该init
也是附加Windows路径的内容(假设您没有在/etc/wsl.conf
中禁用该功能)。 这篇关于通过WSL[COMMAND]&QOOT;调用命令与打开WSL外壳并调用&QOOT;[COMMAND]&QOOT;有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!