CD는 왜 프로그램이 아닌가?

CD는 왜 프로그램이 아닌가?

cd왜 프로그램이 아닌지 항상 궁금했지만 답을 찾지 못했습니다.

왜 이런 일이 일어나는지 아는 사람이 있나요?

답변1

cd명령은 "현재 작업 디렉터리"를 수정합니다. 그렇죠?

"현재 작업 디렉터리"는 각 프로세스의 고유한 속성입니다.

따라서 cd프로그램이라면 다음과 같이 작동합니다.

  1. cd foo
  2. 프로세스가 cd시작됩니다
  3. cd프로세스는 디렉토리를 변경합니다CD 프로세스의 경우
  4. 프로세스 cd종료
  5. 셸은 현재 작업 디렉터리를 포함하여 시작하기 전과 여전히 동일한 상태를 갖습니다.

답변2

cd내장 쉘일 뿐만 아니라,사실 이것도 프로그램이에요POSIX 호환 운영 체제에서. 그들을~ 해야 하다일반 유틸리티에 대한 독립형 실행 파일을 제공합니다. cd예를 들어 이 경우는 다음과 같습니다.솔라리스,엑스, HP-UX 및운영 체제.

분명히 내장 기능은 cd외부 구현이 현재 쉘 디렉토리를 변경하지 않기 때문에 여전히 필수입니다. 그러나 후자가 여전히 유용합니다. 다음 예는 POSIX가 cd이 명령을 사용하여 어떻게 구상하는지 보여줍니다.

find . -type d -exec cd {} \;

POSIX 시스템에서 이 oneliner는 cd입력이 허용되지 않는 디렉터리에 대한 오류 메시지를 보고합니다. 대부분의 Gnu/Linux 배포판에서는 다음 오류 메시지와 함께 실패합니다.

find: `cd': No such file or directory

이것이 귀하의 질문에 대한 답변입니다."CD는 왜 프로그램이 아닌가?” 최초의 Unix 공동 저자 중 한 명이 쓴 것입니다. 초기 Unix 구현에서는 ( cd당시 표기대로) 외부 프로그램이 처음 구현된 후 예기치 않게 작동을 멈췄습니다.chdirfork

인용하다데니스 리치:

기뻐서 뛰던 중에 chdir(현재 디렉토리 변경) 명령이 작동을 멈춘 것을 발견했습니다. 우리는 많은 코드를 읽고 포크를 추가하면 chdir 호출이 어떻게 중단되는지 걱정스럽게 생각했습니다. 마침내 진실이 드러났습니다. chdir은 이전 시스템에서는 일반적인 명령이었습니다. 터미널에 연결된 (유일한) 프로세스의 현재 디렉터리를 조정합니다. 새 시스템에서 chdir 명령은 이를 실행하기 위해 생성된 프로세스의 현재 디렉토리를 올바르게 변경하지만 프로세스는 상위 쉘에 영향을 주지 않고 즉시 종료됩니다! 쉘 내부에서 실행하려면 chdir을 특수 명령으로 만들어야 합니다. 여러 명령 유사 함수에는 로그인과 같은 동일한 속성이 있는 것으로 나타났습니다.

원천:데니스 M. 리치,"유닉스 시분할 시스템의 진화", AT&T Bell Laboratories Technical Magazine 63(6), 2부, 1984년 10월, 1577-93페이지

유닉스 버전 1(1971년 3월) chdir매뉴얼 페이지상태:

각 명령은 실행할 새 프로세스를 생성하므로 chdir이 일반 명령으로 작성된 경우 chdir은 유효하지 않습니다. 따라서 쉘에 의해 인식되고 실행됩니다.

답변3

Bash 소개(껍질이란 무엇입니까?):

셸은 또한 별도의 유틸리티를 통해 얻을 수 없거나 편리하지 않은 기능을 활성화하는 작은 내장 명령 세트(내장)를 제공합니다. 예를 들어 , , cd) 는 셸 자체에서 직접 작동하기 때문에 셸 외부에서 구현할 수 없습니다. , , 내장 명령 등은 별도의 유틸리티로 구현할 수도 있지만 내장 명령으로 사용하는 것이 더 편리합니다. 모든 쉘 내장 함수는 후속 섹션에서 설명됩니다.breakcontinueexechistorygetoptskillpwd

답변4

cdUnix에는 다른 프로세스(또는 상위 프로세스)의 현재 작업 디렉터리를 변경하는 메커니즘이 없기 때문에 셸의 명령은 별도의 프로세스일 수 없습니다.

cd다른 프로세스인 경우 상위 프로세스(셸)의 현재 작업 디렉터리를 변경해야 하는데 이는 Unix에서는 불가능합니다 . 대신에 cd특수 내장 명령입니다. 쉘은 현재 작업 디렉토리를 변경하기 위해 및 같은 chdir()기능을 호출합니다.fchdir()

참고: 커널은 각 프로세스의 현재 작업 디렉터리의 inode 번호를 저장합니다. 하위 프로세스는 cwd상위 프로세스로부터 이를 상속받습니다.

관련 정보