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 都是如此。若要驗證該聲明,請打開過程監控器 作為管理員。新增過濾器「Path -- Contains -- bash -- Include」。現在運行任何WSL1有或沒有該--exec選項的分發。bash以後的情況下不會出現。這裡我選擇 WSL1,因為 WSL2 運行在虛擬機器/容器中,並且 Process Monitor 無法捕獲它。

答案2

兩個指令有什麼區別

如果預設 shell 未更改,則沒有任何區別。

這讓我想到一個問題:--exec 選項的目的為何?

它允許您使用 WSL 發行版中指派的 shell 運行命令。例如,您可以安裝 Z shell,然後在不呼叫 Linux Bash Shell 的情況下執行命令,而是使用 Z Shell 呼叫該命令。

該命令的解釋非常具體。 它只要求使用者知道什麼被視為預設 shell。

來源:

相關內容