WSL 的 `--exec` 选项有什么作用?

WSL 的 `--exec` 选项有什么作用?

使用 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。

来源:

相关内容