通过“wsl [command]”调用命令与打开 wsl shell 并调用“[command]”有什么区别?

2024-04-09

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

C:\Users\scott\Documents>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:\Users\scott\Documents>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:...

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


说实话,当我第一次看到这个问题时,我认为这个问题很容易回答。哦,我错了。它的工作原理有很多细微差别。

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

  • 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).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过“wsl [command]”调用命令与打开 wsl shell 并调用“[command]”有什么区别? 的相关文章

随机推荐