使用 WSL 1,输出wsl.exe --help
包括:
Usage: wsl.exe [Argument] [Options...] [CommandLine] Arguments to run Linux binaries: If no command line is provided, wsl.exe launches the default shell. --exec, -e <CommandLine> Execute the specified command without using the default Linux shell.
那么,两者之间有什么区别呢:
wsl.exe foo
和:
wsl.exe --exec foo
例如,我将默认 shell 保留为 bash,但希望以交互方式使用 fish。为了实现这一点,我尝试使用以下两种方式:
wsl.exe -d Ubuntu fish
和:
wsl.exe -d Ubuntu --exec fish
两者都很好用。
我认为两者之间的进程层次结构可能存在一些差异,但从ps
每个进程运行都会提供类似的结果:fish
并且ps
它自己是唯一列出的进程。
这让我想到一个问题:这个选项的目的是什么--exec
?
答案1
提示:“不使用默认的 Linux shell 执行指定的命令。”
熟悉exec(3)
Linux 内核中的系统调用或
CreateProcess()
Windows用户模式下的API将有助于理解这个答案。
当wsl.exe
仅使用命令执行时,它将被传递给默认 WSL 发行版的默认 shell。然后,shell 会解析命令并执行任何处理(如果需要)(参见示例)。shell 进程不会出现,因为它(父进程)仅执行给定的命令并终止。
但是,当wsl.exe
使用--exec
或-e
选项执行时,给定的命令行不会传递给任何 shell。它会照常执行,而不会进行任何 shell 处理。例如,wsl.exe $(which ls)
可以工作,但是这个wsl.exe --exec $(which ls)
不行,因为$()
不会被任何 shell 处理。
WSL1 和 WSL2 均是如此。要验证该语句,请打开进程监控
以管理员身份运行。添加过滤器“路径 -- 包含 -- bash -- 包含”。现在运行任何WSL1带有和不带有该--exec
选项的发行版。bash
在以后的情况下不会出现。在这里我选择 WSL1,因为 WSL2 在 VM/容器中运行,而 Process Monitor 无法捕获它。
答案2
这两个命令有什么区别
如果默认 shell 没有改变,则没有任何区别。
这让我想到一个问题:--exec 选项的用途是什么?
它允许您使用 WSL 发行版中分配的 shell 运行命令。例如,您可以安装 Z shell,然后运行命令而不调用 Linux Bash Shell,而是使用 Z Shell 调用命令。
该命令的解释很具体。 它只要求用户知道什么被视为默认 shell。
来源: