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 ps
von beiden aus ausführt, erhält man ein ähnliches Ergebnis: fish
und ps
sich selbst als die einzigen aufgelisteten Prozesse.
Dies führt mich zu der Frage: Was ist der Zweck dieser --exec
Option?
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.exe
nur 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.exe
ausgefü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
-e
wsl.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 --exec
Option. bash
wird 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: