
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.exe
Befehl anstelle von zu verwenden bash.exe
. bash.exe
ist noch verfügbar, wird von Microsoft jedoch als „historischer Befehl“ bezeichnet, der „durch“ ersetzt wurde wsl.exe
. Der wsl
Befehl 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 -c
muss eine Befehlszeichenfolge in Anführungszeichen gesetzt werden, wenn Sie sie übergeben. Andernfalls sieht Bash nur das ssh
ohne das ip
.
Der wsl
Befehl 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 -c
Argument 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
exec
eine 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.