Con WSL 1, la salida de wsl.exe --help
incluye:
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.
Por tanto, ¿cuál es la diferencia entre:
wsl.exe foo
y:
wsl.exe --exec foo
Por ejemplo, he mantenido mi shell predeterminado como bash, pero deseo usar fish de forma interactiva. Para lograr esto, he intentado usar ambos:
wsl.exe -d Ubuntu fish
y:
wsl.exe -d Ubuntu --exec fish
Ambos funcionan bien.
Pensé que podría haber alguna diferencia en la jerarquía de procesos entre los dos, pero ejecutar ps
desde cada uno proporciona un resultado similar: fish
y ps
él mismo, como los únicos procesos enumerados.
Esto me lleva a la pregunta: ¿cuál es el propósito de la --exec
opción?
Respuesta1
Sugerencia: "Ejecute el comando especificado sin utilizar el shell de Linux predeterminado".
cierta familiaridad conexec(3)
llamada al sistema en el kernel de Linux o con
CreateProcess()
La API en modo de usuario de Windows será útil para comprender esta respuesta.
Cuando wsl.exe
se ejecuta solo con el comando, se pasa al shell predeterminado de la distribución WSL predeterminada. Luego, el shell analiza el comando y realiza cualquier procesamiento, si es necesario (consulte el ejemplo). El proceso de shell no aparece porque (el proceso principal) solo ejecuta el comando dado y finaliza.
Pero cuando wsl.exe
se ejecuta con la opción --exec
u, -e
la línea de comando dada no se pasa a ningún shell. Se ejecuta como de costumbre sin ningún procesamiento de shell. Por ejemplo, wsl.exe $(which ls)
funciona pero wsl.exe --exec $(which ls)
no porque $()
no lo procesa ningún shell.
Esto es cierto tanto para WSL1 como para WSL2. Para verificar la declaración, abraMonitor de proceso
como administrador. Agregue el filtro "Ruta - Contiene - bash - Incluir". Ahora ejecuta cualquierWSL1Distribución con y sin esa --exec
opción. bash
no aparecerá en un caso posterior. Aquí elijo WSL1 porque WSL2 se ejecuta en una máquina virtual/contenedor y Process Monitor no puede detectarlo.
Respuesta2
¿Cuál es la diferencia entre los dos comandos?
No hay ninguna diferencia si no se ha cambiado el shell predeterminado.
Esto me lleva a la pregunta: ¿cuál es el propósito de la opción --exec?
Le permite ejecutar el comando usando el shell asignado dentro de la distribución WSL. Por ejemplo, puede instalar Z Shell y luego ejecutar un comando sin invocar Linux Bash Shell y, en su lugar, invocar el comando con Z Shell.
La explicación del comando es bastante específica. Sólo requiere que el usuario sepa qué se considera el shell predeterminado.
Fuente: