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
たとえば、私はデフォルトのシェルを bash のままにしていますが、fish を対話的に使用したいと考えています。これを実現するために、次の両方を試しました。
wsl.exe -d Ubuntu fish
そして:
wsl.exe -d Ubuntu --exec fish
どちらも正常に動作します。
2 つのプロセス間の階層に何らかの違いがあるのではないかと考えましたが、ps
それぞれを実行すると同様の結果が得られます。つまり、fish
とps
それ自体が、リストされる唯一のプロセスです。
ここで疑問が湧きます。--exec
オプションの目的は何でしょうか?
答え1
ヒント: 「デフォルトの Linux シェルを使用せずに、指定されたコマンドを実行します。」
ある程度の知識exec(3)
Linuxカーネルのシステムコールまたは
CreateProcess()
Windows ユーザー モードの API は、この回答を理解するのに役立ちます。
コマンドのみで実行されると、wsl.exe
デフォルトの WSL ディストリビューションのデフォルトのシェルに渡されます。次に、シェルはコマンドを解析し、必要に応じて処理を実行します (例を参照)。シェル プロセスは、指定されたコマンドを実行して終了するだけなので表示されません (親プロセス)。
しかし、またはオプションを指定してwsl.exe
を実行すると、指定されたコマンド ラインはどのシェルにも渡されません。シェル処理なしで通常どおり実行されます。たとえば、は機能しますが、これはがどのシェルでも処理されない ため機能しません。--exec
-e
wsl.exe $(which ls)
wsl.exe --exec $(which ls)
$()
これはWSL1とWSL2の両方に当てはまります。この文を確認するには、プロセスモニター
管理者として実行します。フィルター「Path -- Contains -- bash -- Include」を追加します。WS1 について--exec
このオプションの有無にかかわらず、ディストリビューションbash
は後で表示されません。ここでは、WSL2 が VM/コンテナーで実行され、プロセス モニターがそれをキャッチできないため、WSL1 を選択します。
答え2
2つのコマンドの違いは何ですか
デフォルトのシェルが変更されていない場合は違いはありません。
ここで疑問が湧きます。--exec オプションの目的は何でしょうか?
これにより、WSL ディストリビューション内で割り当てられたシェルを使用してコマンドを実行できるようになります。たとえば、Z シェルをインストールし、Linux Bash シェルを呼び出さずにコマンドを実行し、代わりに Z シェルでコマンドを呼び出すことができます。
コマンドの説明は非常に具体的です。 ユーザーは、デフォルトのシェルが何であるかを知るだけで済みます。
ソース: