Это, вероятно, потому что команда cd
должна быть встроена в оболочку, а не что-то внешнее и выполненное. Если внешняя команда изменила каталог, это не повлияет на родительскую оболочку. И нет команды /bin/cd
или /usr/bin/cd
.
Мне не понятна строка «Если внешняя команда изменила каталог, она не влияет на родительскую оболочку».
Обычно, когда оболочка выполняет команду, она выполняет fork()
, а дочерний процесс использует exec()
для выполнения команды, введенной пользователем. Например, если введенная команда 'ls /
', оболочка организует выполнение /bin/ls
с двумя аргументами ls
и /
. Однако, если выбранная команда выполняет системный вызов chdir()
, это влияет на дочерний процесс, но не влияет на родительскую оболочку. Таким образом, оболочка должна обрабатывать саму команду cd
, а не через fork()
и exec()
.
Обратите внимание, что в DOS файл .BAT может выполнять cd
, и это влияет на процесс cmd.exe
. Этого не происходит в Unix - дочерний процесс не может влиять на текущий каталог родительского процесса.