В WSL 1 выходные данные 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.
Итак, в чем разница между:
wsl.exe foo
и:
wsl.exe --exec foo
Например, я оставил оболочку по умолчанию bash, но хочу использовать fish интерактивно. Чтобы добиться этого, я пробовал использовать оба:
wsl.exe -d Ubuntu fish
и:
wsl.exe -d Ubuntu --exec fish
Оба работают отлично.
Я думал, что между ними может быть какая-то разница в иерархии процессов, но запуск ps
из каждого из них дает схожий результат: fish
и ps
он сам, как единственные перечисленные процессы.
Это подводит меня к вопросу: какова цель этой --exec
опции?
решение1
Подсказка: «Выполнить указанную команду, не используя оболочку Linux по умолчанию».
Некоторое знакомство сexec(3)
системный вызов в ядре Linux или с
CreateProcess()
API в пользовательском режиме Windows будет полезен для понимания этого ответа.
При wsl.exe
выполнении только команды она передается в оболочку по умолчанию дистрибутива WSL по умолчанию. Затем оболочка анализирует команду и выполняет любую обработку, если требуется (см. пример). Процесс оболочки не отображается, поскольку он (родительский процесс) только выполняет указанную команду и завершается.
Но когда wsl.exe
выполняется с опцией --exec
или -e
данная командная строка не передается ни в одну оболочку. Она выполняется как обычно без какой-либо обработки оболочкой. Например, wsl.exe $(which ls)
работает, а это wsl.exe --exec $(which ls)
нет, потому что $()
не обрабатывается ни одной оболочкой.
Это справедливо как для WSL1, так и для WSL2. Чтобы проверить утверждение, откройтеМонитор процесса
как администратор. Добавьте фильтр "Path -- Contains -- bash -- Include". Теперь запустите любойWSL1распределение с этой --exec
опцией и без нее. bash
не будет отображаться в последнем случае. Здесь я выбираю WSL1, потому что WSL2 работает в виртуальной машине/контейнере и Process Monitor не может его поймать.
решение2
В чем разница между двумя командами?
Если оболочка по умолчанию не была изменена, никакой разницы нет.
Это подводит меня к вопросу: каково назначение опции --exec?
Он позволяет вам запускать команду с помощью оболочки, назначенной в дистрибутиве WSL. Например, вы можете установить оболочку Z, а затем запустить команду без вызова Linux Bash Shell и вместо этого вызвать команду с помощью Z Shell.
Объяснение команды весьма конкретное. Пользователю необходимо только знать, какая оболочка считается оболочкой по умолчанию.
Источник: