중복 가능성:
CD는 왜 프로그램이 아닌가?
일반적으로 사용되는 다른 모든 유틸리티(예: ls, cp, rm
등)는 실제로 /bin에 있는 파일이라는 것을 알았습니다. 하지만 cd
그렇지 않습니다. 또한 다른 바이너리 디렉터리(예: 등)에도 없습니다 /usr/bin, /bin, /sbin
.
왜 이런 일이 발생합니까?
답변1
cd
는내장 케이스. 따라서 별도의 실행 파일이 아닌 셸 자체의 일부입니다.
기본적으로 내장 함수에는 두 가지 범주가 있습니다.
- 특수 내장 기능셸과 밀접하게 연결되어 있으며 독립적으로 구현할 수 없거나 그렇게 하는 데 기능적 의미가 없기 때문에 구현할 수 없습니다(주로 셸 제어와 관련됨). 그들은 특정한 특징을 가지고 있기 때문에 "특별"이라고 불립니다.오류 처리 및 변수 할당의미론.
- 일반 내장 기능일반적으로 성능상의 이유로 셸 내부(예:
cd
)를 조작하거나 그렇게 하는 것이 기술적으로 더 쉽기 때문에 셸에서 구현됩니다. 어떤 경우에는 일반 내장이 내장되지 않은 형태로도 존재할 수 있습니다. 후자의 경우의 예는echo
모든 현대 쉘에서 구현되지만 주로 역사적인 이유로 존재한다는 것입니다/bin/echo
.
중요한 기능을 내장해야 하는 또 다른 이유는 시스템에 치명적인 일이 발생하더라도 핵심 기능에 계속 액세스할 수 있다는 것입니다. 예 를 들어, 공유 라이브러리가 손상되었거나 액세스할 수 없는 경우, /bin
./sbin
답변2
일부 Unix 역사적 자료에서는 cd라고 말합니다.예전에는(아주 초기) Unix 개발 기간의 외부 명령입니다. 이것은 수정할 수 있는 특수 명령입니다.부모현재 디렉터리.
다음 사실에서 이 역사적 상태의 시작을 볼 수 있습니다.가지다/usr/bin/cd는 쉘 내장 명령 외에 실제 명령으로 사용됩니다. 그러나 현재 시스템에서 실제로 사용되는지는 확실하지 않습니다.
이는 외부 명령으로서 Unix 개발자가 셸 내장 명령을 사용할 수 있게 된 이후 제거된 임시 솔루션이었습니다. 간단한 시스템 호출만으로 충분할 수 있는 완전한 명령(자체 프로세스, 디스크에서 로드 등이 있어야 함)을 갖는 것은 너무 비쌉니다. 그래서 내장 함수가 되었고 그 이후로 상태가 변하지 않았습니다.
거의 모든 명령이 내장된 셸을 만들 수 있습니다. 이는 단지 설계 상충일 뿐입니다. 예를 들어,CP여기에 언급된 기능은 이에 대한 좋은 후보일 수 있습니다. 이 내장 기능은 이미 MS-DOS의 일부 셸에 구현되어 있습니다. 그러나 Unix에서는 프로세스를 만들고 시작하는 것이 더 저렴하며 다른 프로세스에서 구현할 수 없는 경우가 아니면 기능을 내부적으로 개발할 필요가 없습니다. 여기에는 다음이 포함됩니다CD,한계값,출구, 변수 연산, 제어 흐름 명령(만약에,~을 위한,하지만잠깐만요 잠깐만요.