Was macht die WSL-Option „--exec“?

Was macht die WSL-Option „--exec“?

Mit WSL 1 umfasst die Ausgabe 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.

Was ist also der Unterschied zwischen:

wsl.exe foo

Und:

wsl.exe --exec foo

Ich habe beispielsweise Bash als Standard-Shell beibehalten, möchte aber Fish interaktiv verwenden. Um dies zu erreichen, habe ich versucht, beides zu verwenden:

wsl.exe -d Ubuntu fish

Und:

wsl.exe -d Ubuntu --exec fish

Beide funktionieren einwandfrei.

Ich dachte, dass es möglicherweise einen Unterschied in der Prozesshierarchie zwischen den beiden gibt, aber wenn man sie psvon beiden aus ausführt, erhält man ein ähnliches Ergebnis: fishund pssich selbst als die einzigen aufgelisteten Prozesse.

Dies führt mich zu der Frage: Was ist der Zweck dieser --execOption?

Antwort1

Hinweis: „Führen Sie den angegebenen Befehl aus, ohne die Standard-Linux-Shell zu verwenden.“

Einige Vertrautheit mitexec(3)Systemaufruf im Linux-Kernel oder mit CreateProcess()Die API im Windows-Benutzermodus hilft beim Verständnis dieser Antwort.

Wenn wsl.exenur mit dem Befehl ausgeführt wird, wird es an die Standardshell der Standard-WSL-Distribution übergeben. Die Shell analysiert dann den Befehl und führt bei Bedarf die Verarbeitung durch (siehe Beispiel). Der Shell-Prozess wird nicht angezeigt, da er (übergeordneter Prozess) nur den angegebenen Befehl ausführt und beendet wird.

Wenn jedoch mit der Option oder wsl.exeausgeführt wird, wird die angegebene Befehlszeile nicht an eine Shell übergeben. Sie wird wie üblich ohne Shell-Verarbeitung ausgeführt. Beispielsweise funktioniert, aber dies funktioniert nicht, weil es von keiner Shell verarbeitet wird.--exec-ewsl.exe $(which ls)wsl.exe --exec $(which ls)$()

Dies gilt sowohl für WSL1 als auch für WSL2. Um die Aussage zu überprüfen, öffnen SieProzessmonitor als Administrator. Fügen Sie den Filter "Pfad -- Enthält -- bash -- Einschließen" hinzu. Führen Sie nunWSL1Verteilung mit und ohne diese --execOption. bashwird im späteren Fall nicht angezeigt. Hier wähle ich WSL1, weil WSL2 in einer VM/einem Container ausgeführt wird und Process Monitor es nicht erfassen kann.

Antwort2

Was ist der Unterschied zwischen den beiden Befehlen

Es gibt keinen Unterschied, wenn die Standard-Shell nicht geändert wurde.

Dies führt mich zu der Frage: Was ist der Zweck der Option --exec?

Sie können den Befehl mithilfe der Shell ausführen, die in der WSL-Distribution zugewiesen ist. Sie können beispielsweise Z Shell installieren und dann einen Befehl ausführen, ohne Linux Bash Shell aufzurufen, und den Befehl stattdessen mit Z Shell aufrufen.

Die Erklärung des Befehls ist ziemlich spezifisch. Der Benutzer muss lediglich wissen, was als Standard-Shell gilt.

Quelle:

verwandte Informationen