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각각에서 실행하면 유사한 결과가 제공됩니다. fishps, 나열된 유일한 프로세스로서 그 자체입니다.

이것은 나에게 다음과 같은 질문으로 이어진다: 옵션의 목적은 무엇인가 --exec?

답변1

힌트: "기본 Linux 셸을 사용하지 않고 지정된 명령을 실행합니다."

어느 정도 익숙함exec(3)Linux 커널 또는 다음을 사용하여 시스템 호출 CreateProcess()Windows 사용자 모드의 API는 이 답변을 이해하는 데 도움이 될 것입니다.

wsl.exe명령만 사용하여 실행 되면 기본 WSL 배포판의 기본 셸로 전달됩니다. 그런 다음 쉘은 명령을 구문 분석하고 필요한 경우 처리를 수행합니다(예제 참조). 쉘 프로세스(상위 프로세스)는 주어진 명령만 실행하고 종료하므로 나타나지 않습니다.

그러나 또는 옵션을 wsl.exe사용하여 실행 하면 주어진 명령줄이 어떤 쉘에도 전달되지 않습니다. 쉘 처리 없이 평소대로 실행됩니다. 예를 들어, 작동하지만 쉘에서 처리되지 않기 때문에 작동하지 않습니다 .--exec-ewsl.exe $(which ls)wsl.exe --exec $(which ls)$()

이는 WSL1과 WSL2 모두에 해당됩니다. 명세서를 확인하려면 다음을 엽니다.프로세스 모니터 관리자로서. "경로 -- 포함 -- bash -- 포함" 필터를 추가합니다. 이제 아무거나 실행하세요.WSL1해당 옵션이 있거나 없는 배포 --exec. bash나중에는 표시되지 않습니다. 여기서는 WSL2가 VM/컨테이너에서 실행되고 프로세스 모니터가 이를 포착할 수 없기 때문에 WSL1을 선택합니다.

답변2

두 명령의 차이점은 무엇입니까

기본 쉘이 변경되지 않은 경우에는 아무런 차이가 없습니다.

--exec 옵션의 목적은 무엇입니까?

이를 통해 WSL 배포판 내에 할당된 셸을 사용하여 명령을 실행할 수 있습니다. 예를 들어 Z 셸을 설치한 다음 Linux Bash 셸을 호출하지 않고 명령을 실행하고 대신 Z 셸을 사용하여 명령을 호출할 수 있습니다.

명령에 대한 설명은 매우 구체적입니다. 사용자는 기본 쉘로 간주되는 것이 무엇인지 알아야 합니다.

원천:

관련 정보