외부 명령이 별도의 프로세스를 생성하여 셸에서 실행되는 것으로 알고 있는데, 셸에서 내장 명령을 실행하면 정확히 어떻게 될까요?
함수로 실행됩니까, 아니면 쉘이 이를 실행하기 위해 새 스레드를 생성합니까?
답변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별도의 프로세스 - 또는 특정 내장 기능이 쉘 내부에 직접 액세스해야 하기 때문입니다.