cd
кроме того, что он встроен в оболочку, он также является программой на POSIX-совместимых ОС. Они должны предоставлять независимые исполняемые файлы для обычных утилит, например cd
. Это, например , в случае с Solaris , AIX , HP-UX и OS X .
Очевидно, что встроенная функция cd
все еще обязательна, поскольку ее внешняя реализация не меняет текущий каталог оболочки. Однако последнее все же может быть полезным. Вот пример, показывающий, как POSIX представляет, как cd
можно использовать эту команду:
find . -type d -exec cd {} \;
В системе POSIX этот oneliner сообщит об ошибке для всех каталогов, в которые вы не можете войти cd
. В большинстве дистрибутивов Gnu / Linux это сообщение об ошибке завершается с ошибкой:
find: `cd': No such file or directory
И вот ответ на ваш вопрос « Почему компакт-диск не является программой? » Одного из оригинальных соавторов Unix. В очень ранней реализации Unix cd
(написанной chdir
в то время) была внешняя программа. Он просто неожиданно перестал работать после того, как fork
был впервые реализован.
Цитирую Денниса Ричи :
В разгар нашего ликования было обнаружено, что команда chdir (изменить текущий каталог) перестала работать. Было много чтения кода и тревожного самоанализа о том, как добавление fork могло сломать вызов chdir. Наконец дошла правда: в старой системе чдир был обычной командой; он корректировал текущий каталог (уникального) процесса, подключенного к терминалу. В новой системе команда chdir правильно изменила текущий каталог процесса, созданного для его выполнения, но этот процесс быстро завершился и никак не повлиял на его родительскую оболочку! Необходимо было сделать chdir специальной командой, выполняемой внутри оболочки. Оказывается, что несколько командоподобных функций имеют одно и то же свойство, например, login.
Источник: Деннис М. Ричи, « Эволюция системы разделения времени Unix », Технический журнал AT & T Bell Laboratories 63 (6), часть 2, октябрь 1984 г., с. 1577–93.
Unix Версия 1 (март 1971 г.) содержит следующую страницу руководства chdir :
Поскольку для выполнения каждой команды создается новый процесс, chdir будет неэффективным, если он будет записан как обычная команда. Поэтому он распознается и исполняется Shell.