Com WSL 1, a saída wsl.exe --help
inclui:
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 ps
a partir de cada um fornece um resultado semelhante: fish
e ps
ele mesmo, como os únicos processos listados.
Isso me leva à pergunta: qual é o propósito da --exec
opçã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 --exec
ou -e
a 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 --exec
opção. bash
nã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: