Что делает опция WSL `--exec`?

Что делает опция WSL `--exec`?

В 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.

Объяснение команды весьма конкретное. Пользователю необходимо только знать, какая оболочка считается оболочкой по умолчанию.

Источник:

Связанный контент