Wie kann ich das WSL-Terminal mit einem Befehl öffnen, ohne dass es automatisch geschlossen wird?

Wie kann ich das WSL-Terminal mit einem Befehl öffnen, ohne dass es automatisch geschlossen wird?

Ich verwende Ubuntu mit WSL1 und möchte in Windows verschiedene Verknüpfungen erstellen, um beim Start von WSL verschiedene Befehle auszuführen, z. B. eine, um automatisch eine SSH-Sitzung zu starten, eine andere, um in ein bestimmtes Verzeichnis zu wechseln. Sobald der Startbefehl ausgeführt wurde, muss er wie gewohnt weiterlaufen, aber alles, was ich versucht habe, schließt das Terminal. Ich habe so etwas ausprobiert wie

c:\windows\system32\bash.exe -c -i -s ssh ip

Aber es scheint nichts zu passieren, und wenn doch, schließt es sich viel zu schnell, als dass ich es erkennen könnte.

Antwort1

Zunächst empfehle ich Ihnen, den neueren (von Microsoft empfohlenen) wsl.exeBefehl anstelle von zu verwenden bash.exe. bash.exeist noch verfügbar, wird von Microsoft jedoch als „historischer Befehl“ bezeichnet, der „durch“ ersetzt wurde wsl.exe. Der wslBefehl bietet außerdem weitaus mehr Optionen als der ältere bash.exe.

Das erste Problem ist, dass Ihre Befehlszeile einen Syntax-/Anführungszeichenfehler enthält. Die Registerkarte „Windows Terminal“ wird also geschlossen, bevor Sie sie lesen können. Am besten führen Sie dies zuerst von einem PowerShell- oder CMD-Profil/-Tab aus aus, um die Ausgabe sehen zu können:

PS> bash.exe -c -i -s ssh ip
usage: ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
           [-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
           [-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
           [-i identity_file] [-J [user@]host[:port]] [-L address]
           [-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
           [-Q query_option] [-R address] [-S ctl_path] [-W host:port]
           [-w local_tun[:remote_tun]] destination [command]
PS> bash.exe -c "ssh ip"
user@ip's password:
PS> wsl ssh ip
user@ip's password:
PS> wsl -e bash -c ssh ip
<displays usage information as above>
PS> wsl -e bash -c "ssh ip"
user@ip's password:

Wie Sie sehen, bash -cmuss eine Befehlszeichenfolge in Anführungszeichen gesetzt werden, wenn Sie sie übergeben. Andernfalls sieht Bash nur das sshohne das ip.

Der wslBefehl hingegentutAufruf direkt ohne Anführungszeichen zulassen. Es ist grundsätzlich intelligent genug, den Rest der Befehlszeile (nachdem alle Argumente/Flags verarbeitet wurden) in Anführungszeichen an das -cArgument an die Standard-Shell zu übergeben. Ein Beispiel hierfür finden Sie oben mit dem wsl ssh ip.

Als nächstes möchten Sie wissen, wie Sie die Registerkarte/Shell nach dem Ausführen eines Befehls geöffnet halten. Dies kann auf verschiedene Arten erfolgen, aber die einfachste ist:

  • Starten einer Shell
  • Führen Sie den ersten Befehl aus
  • execeine Ersatzschale, die weiter funktioniert

Wie Sie erfahren haben, führt allein die Ausführung der ersten beiden Schritte dazu, dass die Shell geschlossen wird, wenn der Befehl beendet wird.

Das sieht dann ungefähr so ​​aus:

wsl -e bash -c "ls; exec bash"

Antwort2

C:\Windows\System32\cmd.exe /k wsl /path/to/script.sh

Der Schalter /k sorgt dafür, dass cmd nicht beendet wird, sodass Sie die Ausgabe lesen können. WSL hat keinen ähnlichen Schalter.

verwandte Informationen