내장 명령이 쉘에서 실행되면 정확히 무슨 일이 발생합니까?

내장 명령이 쉘에서 실행되면 정확히 무슨 일이 발생합니까?

외부 명령이 별도의 프로세스를 생성하여 셸에서 실행되는 것으로 알고 있는데, 셸에서 내장 명령을 실행하면 정확히 어떻게 될까요?

함수로 실행됩니까, 아니면 쉘이 이를 실행하기 위해 새 스레드를 생성합니까?

답변1

cd_builtin구체적인 예를 들어, buildins/cd.def(bash 소스 코드)에 정의된 함수가 있습니다 . 일반적 cd으로 이 함수를 호출하여 수행됩니다. 그러나 파이프라인에서 사용하는 경우 먼저 분기될 수 있습니다. 예를 들어 cd / | echo하위 항목을 분기하고 호출합니다 cd_builtin. 실제로 변경되지 않은 디렉터리를 통해 이를 확인할 수도 있습니다.

anthony@Zia:~$ cd /tmp/
anthony@Zia:/tmp$ cd / | echo -n
anthony@Zia:/tmp$ cd /
anthony@Zia:/$ 

디렉토리는 파이프하지 않을 때만 변경된다는 점에 유의하세요 cd.

답변2

정의에 따라 내장 명령은 다른 프로그램이 아닌 기본 실행 파일 내에서 실행됩니다.

모든 쉘 명령은 동기식입니다. 쉘은 다음 명령을 실행하기 전에 명령이 완료될 때까지 기다립니다. 외부 명령을 실행할 때 셸은 명령을 실행하고 명령이 종료될 때까지 기다려야 하는 별도의 프로세스를 만들어야 합니다. 내장 명령을 실행할 때 새 실행 스레드를 만들 필요가 없습니다. 명령은 기본 스레드 내에서 실행됩니다.

나는 일반적인 쉘이 내부 디자인에 스레드를 사용하지 않는다고 생각합니다. 셸 기능은 기존 프로세스당 단일 스레드 Unix 모델과 밀접하게 연결되어 있으므로 스레드는 셸 설계의 모든 문제를 해결할 수 있습니다.

각 내장 함수는 쉘 소스 코드의 특정 수준에 있는 함수로 구현될 가능성이 높습니다.

답변3

내 생각엔 실행 공간 내에서 함수로 실행되는 것 같아요 bash. 댓글이 하나 있습니다고급 Bash 스크립팅 가이드그 진술은 다음과 같다:

발췌

내장 명령은 실제로 내장된 Bash 도구 세트에 포함된 명령입니다. 이는 성능상의 이유 중 하나입니다. 내장 명령은 일반적으로 분기가 필요한 외부 명령보다 빠르게 실행됩니다.1별도의 프로세스 - 또는 특정 내장 기능이 쉘 내부에 직접 액세스해야 하기 때문입니다.

관련 정보