通过 "wsl [command]" 调用命令与打开 wsl shell 并调用“[command]”有什么区别?
What is the difference between calling a command via "wsl [command]" and opening a wsl shell and calling "[command]"?
我在 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
- 用
wsl echo $PATH
启动的 shell 既不是登录 shell 也不是交互式 shell
所以第一个将获取登录脚本(例如~/.profile
)和交互式启动脚本(例如~/.bashrc
)。第二种形式没有获得其中任何一个的来源。
您可以使用以下命令以不同的方式查看(并找到解决方案):
wsl -e bash -c 'echo $PATH'
wsl -e bash -li -c 'echo $PATH'
-li
强制 bash 到 运行 作为登录和交互 shell,从而获取所有适用的启动脚本。而且,正如@bovquier 在评论中指出的那样,这里需要一个单引号来防止 PowerShell 在到达 Bash 之前插入 $
。那,还是逃避吧。
您应该能够 运行 TeX Live 以相同的方式,只需将“echo $PATH”替换为您需要的 TeX Live 启动命令。
第二个选项是创建一个脚本,添加路径和 运行 命令,然后通过 wsl /path/to/script.sh
启动该脚本
也就是说,老实说,我不认为您当前的 login/interactive PATH 来自 /etc/environment
。至少在我的测试中,/etc/environment
在 WSL 中没有用处,这是可以预料的。 /etc/environment
仅由 PAM 模块提供,WSL 不执行登录检查,因此没有理由在 wsl
或 [=11] 中调用 PAM =] 命令。
我希望您在 ~/.bashrc
或类似的地方仍然有 PATH 设置),这就是 shell 目前从中获取它的地方。
虽然这对于理解答案不一定很重要,但您可能还会想知道,如果 /etc/environment
不用于设置 WSL 中的默认(非登录、非交互)路径,那么什么是?答案似乎是它被硬编码到启动 WSL 的 init
中。 init
也是追加 Windows 路径的内容(假设您没有在 /etc/wsl.conf
中禁用该功能)。
我在 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- 用
wsl echo $PATH
启动的 shell 既不是登录 shell 也不是交互式 shell
所以第一个将获取登录脚本(例如~/.profile
)和交互式启动脚本(例如~/.bashrc
)。第二种形式没有获得其中任何一个的来源。
您可以使用以下命令以不同的方式查看(并找到解决方案):
wsl -e bash -c 'echo $PATH'
wsl -e bash -li -c 'echo $PATH'
-li
强制 bash 到 运行 作为登录和交互 shell,从而获取所有适用的启动脚本。而且,正如@bovquier 在评论中指出的那样,这里需要一个单引号来防止 PowerShell 在到达 Bash 之前插入 $
。那,还是逃避吧。
您应该能够 运行 TeX Live 以相同的方式,只需将“echo $PATH”替换为您需要的 TeX Live 启动命令。
第二个选项是创建一个脚本,添加路径和 运行 命令,然后通过 wsl /path/to/script.sh
也就是说,老实说,我不认为您当前的 login/interactive PATH 来自 /etc/environment
。至少在我的测试中,/etc/environment
在 WSL 中没有用处,这是可以预料的。 /etc/environment
仅由 PAM 模块提供,WSL 不执行登录检查,因此没有理由在 wsl
或 [=11] 中调用 PAM =] 命令。
我希望您在 ~/.bashrc
或类似的地方仍然有 PATH 设置),这就是 shell 目前从中获取它的地方。
虽然这对于理解答案不一定很重要,但您可能还会想知道,如果 /etc/environment
不用于设置 WSL 中的默认(非登录、非交互)路径,那么什么是?答案似乎是它被硬编码到启动 WSL 的 init
中。 init
也是追加 Windows 路径的内容(假设您没有在 /etc/wsl.conf
中禁用该功能)。