對於 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。
來源: