¿Cómo puedo abrir la terminal WSL con un comando sin que se cierre automáticamente?

¿Cómo puedo abrir la terminal WSL con un comando sin que se cierre automáticamente?

Estoy ejecutando Ubuntu con WSL1 y quiero crear diferentes accesos directos en Windows para ejecutar diferentes comandos al iniciar WSL, por ejemplo, uno para iniciar automáticamente una sesión SSH y otro para cambiar a un directorio específico. Una vez que se ejecuta el comando de inicio, necesito que siga ejecutándose como de costumbre, pero todo lo que he probado cierra la terminal. He probado algo como

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

Pero no parece hacer nada, o si lo hace, se cierra demasiado rápido para que yo pueda verlo.

Respuesta1

En primer lugar, le recomendaré que utilice el wsl.execomando más nuevo (recomendado por Microsoft), en lugar de bash.exe. bash.exetodavía está disponible, pero Microsoft lo llama un "comando histórico" que ha sido "reemplazado por" wsl.exe. El wslcomando también ofrece muchas más opciones que el anterior bash.exe.

El primer problema que tiene es que hay un error de sintaxis/comillas en su línea de comando, así que sí, la pestaña Terminal de Windows se cierra antes de que pueda leerla. Lo mejor es ejecutar esto desde un perfil/pestaña de PowerShell o CMD primero para poder ver el resultado:

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:

Como puede ver, si está pasando una cadena de comando a bash -c, debe estar entre comillas. De lo contrario, bash simplemente verá el archivo sshsin el archivo ip.

El wslcomando, por otra parte,hacepermitir la invocación directamente sin las comillas. Básicamente, es lo suficientemente inteligente como para pasar el resto de la línea de comandos (después de que se hayan procesado todos los argumentos/indicadores) al shell predeterminado, citado en el -cargumento. Puedes ver un ejemplo de esto arriba con el archivo wsl ssh ip.

Lo siguiente que desea saber es cómo mantener abierta la pestaña/shell después de ejecutar un comando. Esto se puede hacer de varias maneras, pero la más sencilla es:

  • iniciar un caparazón
  • Ejecute el primer comando
  • execun shell de reemplazo que seguirá funcionando

Como ha experimentado, simplemente hacer los dos primeros hará que el shell se cierre cuando salga el comando.

Esto se verá así:

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

Respuesta2

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

El modificador /k hace que cmd no salga para que pueda leer la salida. wsl no tiene un modificador similar.

información relacionada