O que a opção `--exec` do WSL faz?

O que a opção `--exec` do WSL faz?

Com WSL 1, a saída wsl.exe --helpinclui:

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.

Portanto, qual é a diferença entre:

wsl.exe foo

e:

wsl.exe --exec foo

Por exemplo, mantive meu shell padrão como bash, mas desejo usar fish interativamente. Para conseguir isso, tentei usar ambos:

wsl.exe -d Ubuntu fish

e:

wsl.exe -d Ubuntu --exec fish

Ambos funcionam bem.

Achei que poderia haver alguma diferença na hierarquia de processos entre os dois, mas executar psa partir de cada um fornece um resultado semelhante: fishe psele mesmo, como os únicos processos listados.

Isso me leva à pergunta: qual é o propósito da --execopção?

Responder1

Dica: "Execute o comando especificado sem usar o shell padrão do Linux."

Alguma familiaridade comexec(3)chamada de sistema no kernel Linux ou com CreateProcess()A API no modo de usuário do Windows será útil para entender esta resposta.

Quando wsl.exeé executado apenas com o comando, ele é passado para o shell padrão da distribuição WSL padrão. O shell então analisa o comando e faz qualquer processamento, se necessário (veja o exemplo). O processo shell não aparece porque (processo pai) apenas executa o comando fornecido e termina.

Mas quando wsl.exeé executado com a opção --execou -ea linha de comando fornecida não é passada para nenhum shell. Ele é executado normalmente, sem qualquer processamento de shell. Por exemplo, wsl.exe $(which ls)funciona, mas wsl.exe --exec $(which ls) não funciona porque $()não é processado por nenhum shell.

Isso é verdade para WSL1 e WSL2. Para verificar a declaração, abraMonitor de Processo como administrador. Adicione o filtro "Caminho -- Contém -- bash -- Incluir". Agora execute qualquerWSL1distribuição com e sem essa --execopção. bashnão aparecerá em um caso posterior. Aqui eu escolho WSL1 porque WSL2 é executado em uma VM/contêiner e o Process Monitor não consegue capturá-lo.

Responder2

Qual é a diferença entre os dois comandos

Não há nenhuma diferença se o shell padrão não tiver sido alterado.

Isso me leva à pergunta: qual é o propósito da opção --exec?

Ele permite que você execute o comando usando o shell atribuído na distribuição WSL. Por exemplo, você pode instalar o Z Shell e, em seguida, executar um comando sem invocar o Linux Bash Shell e, em vez disso, invocar o comando com Z Shell.

A explicação do comando é bastante específica. Requer apenas que o usuário saiba o que é considerado o shell padrão.

Fonte:

informação relacionada