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()
Windows 사용자 모드의 API는 이 답변을 이해하는 데 도움이 될 것입니다.
wsl.exe
명령만 사용하여 실행 되면 기본 WSL 배포판의 기본 셸로 전달됩니다. 그런 다음 쉘은 명령을 구문 분석하고 필요한 경우 처리를 수행합니다(예제 참조). 쉘 프로세스(상위 프로세스)는 주어진 명령만 실행하고 종료하므로 나타나지 않습니다.
그러나 또는 옵션을 wsl.exe
사용하여 실행 하면 주어진 명령줄이 어떤 쉘에도 전달되지 않습니다. 쉘 처리 없이 평소대로 실행됩니다. 예를 들어, 작동하지만 쉘에서 처리되지 않기 때문에 작동하지 않습니다 .--exec
-e
wsl.exe $(which ls)
wsl.exe --exec $(which ls)
$()
이는 WSL1과 WSL2 모두에 해당됩니다. 명세서를 확인하려면 다음을 엽니다.프로세스 모니터
관리자로서. "경로 -- 포함 -- bash -- 포함" 필터를 추가합니다. 이제 아무거나 실행하세요.WSL1해당 옵션이 있거나 없는 배포 --exec
. bash
나중에는 표시되지 않습니다. 여기서는 WSL2가 VM/컨테이너에서 실행되고 프로세스 모니터가 이를 포착할 수 없기 때문에 WSL1을 선택합니다.
답변2
두 명령의 차이점은 무엇입니까
기본 쉘이 변경되지 않은 경우에는 아무런 차이가 없습니다.
--exec 옵션의 목적은 무엇입니까?
이를 통해 WSL 배포판 내에 할당된 셸을 사용하여 명령을 실행할 수 있습니다. 예를 들어 Z 셸을 설치한 다음 Linux Bash 셸을 호출하지 않고 명령을 실행하고 대신 Z 셸을 사용하여 명령을 호출할 수 있습니다.
명령에 대한 설명은 매우 구체적입니다. 사용자는 기본 쉘로 간주되는 것이 무엇인지 알아야 합니다.
원천: