Я всегда удивлялся, почему cd
это не программа, но так и не смог найти ответ.
Кто-нибудь знает, почему это так?
shell
command
cd-command
shell-builtin
AkshaiShah
источник
источник
cd
команда unix была отдельной программой. Оболочка обращалась с ним специально тем, чего нетfork
, простоexec
. И когдаcd
это будет сделано, это будет execsh
. Я не знаю, правда ли это.chdir
системный вызов. источники: v1 v5 v7 (первая версия с оболочкой Bourne)cd
том, что прочитал. Я был явно не прав насчет этого, теперь, когда @jlliagre заполнил детали.Ответы:
Команда
cd
изменяет «текущий рабочий каталог», верно?«Текущий рабочий каталог» - это свойство, уникальное для каждого процесса.
Итак, если бы
cd
была программа, она бы работала так:cd foo
cd
процесс начинаетсяcd
процесс изменяет каталог для процесса кдcd
процесс завершаетсяисточник
cd
была программа, она работала бы так», «должна быть», когдаcd
она используется во внешней реализации программы, она работает так ».cd
кроме того, что он встроен в оболочку, он также является программой на POSIX-совместимых ОС. Они должны предоставлять независимые исполняемые файлы для обычных утилит, напримерcd
. Это, например , в случае с Solaris , AIX , HP-UX и OS X .Очевидно, что встроенная функция
cd
все еще обязательна, поскольку ее внешняя реализация не меняет текущий каталог оболочки. Однако последнее все же может быть полезным. Вот пример, показывающий, как POSIX представляет, какcd
можно использовать эту команду:В системе POSIX этот oneliner сообщит об ошибке для всех каталогов, в которые вы не можете войти
cd
. В большинстве дистрибутивов Gnu / Linux это сообщение об ошибке завершается с ошибкой:И вот ответ на ваш вопрос « Почему компакт-диск не является программой? » Одного из оригинальных соавторов Unix. В очень ранней реализации Unix
cd
(написаннойchdir
в то время) была внешняя программа. Он просто неожиданно перестал работать после того, какfork
был впервые реализован.Цитирую Денниса Ричи :
Источник: Деннис М. Ричи, « Эволюция системы разделения времени Unix », Технический журнал AT & T Bell Laboratories 63 (6), часть 2, октябрь 1984 г., с. 1577–93.
Unix Версия 1 (март 1971 г.) содержит следующую страницу руководства chdir :
Поскольку для выполнения каждой команды создается новый процесс, chdir будет неэффективным, если он будет записан как обычная команда. Поэтому он распознается и исполняется Shell.
источник
cd
исполняемый файл, но он ничего не должен делать (за исключением, возможно, выдачи сообщений об ошибках при вызове с неверными аргументами). Weird.Из введения Bash ( Что такое оболочка? ):
источник
Для апреля Дурака в этом году я написал отдельную версию
cd
.Никто не получил шутку. Вздох.
Любой, кто не уверен, что
cd
должен быть встроен в оболочку, должен скачать ее, собрать и попробовать.Читайте также его справочную страницу. :)
источник
/bin/cd
. Если вы хотите взять мой код и сделать его своим собственным квестом, вы можете это сделать.Команда
cd
в оболочке не может быть отдельным процессом, потому что в Unix нет механизма для изменения текущего рабочего каталога другого процесса (даже родительского процесса).Если бы это
cd
был другой процесс, ему пришлось бы изменить текущий рабочий каталог своего родителя (оболочки), что невозможно в Unix. Вместо этогоcd
есть специальная встроенная команда. Оболочка вызывает такие функции, какchdir()
иfchdir()
изменяет свой текущий рабочий каталог.Примечание: ядро хранит номер индекса текущего рабочего каталога для каждого процесса. Дочерний процесс наследует его
cwd
от своего родителя.источник
CD - это встроенная команда оболочки. Так легко, как есть. Человек CD говорит все это. команда cd изменяет рабочий каталог для всех интерпретаторов и (в поточной среде) всех потоков.
источник
cd
встроена. Я бы посоветовал вам прочитать ответы с самым высоким рейтингом и подумать, как можно улучшить свой ответ.Я думаю, что в ответах людей отсутствует одна вещь: текущий каталог - это переменная среды, которую может изменить каждая программа. Если вы используете команду «export» для просмотра текущего списка переменных среды, у вас будет:
в ваших результатах. Таким образом, с помощью команды 'cd' мы просто хотим изменить эту внутреннюю переменную. Я думаю, что если мы попробуем, мы, конечно, можем изменить переменную PWD любого pty в оболочке. Подобно:
Но я думаю, что в нормальных случаях нет необходимости. Другими словами, мы получаем помощь от bash (или любой оболочки) для изменения определенной внутренней переменной.
источник
..
путь, а не путь, с которого вы его начали:#include <stdlib.h>
int main(void) { chdir(".."); puts(getenv("PWD")); }
(кстати, оболочки C показывают CWD как% cwd.)#include <unistd.h>
int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }
он покажет каталог, из которого вы запустили программу, а не/
.$PWD
имеет значение только для оболочки Борна. Это всего лишь способ для оболочки передать что-то, что она знает, сценариям оболочки, поэтому им не нужно вызывать,pwd
чтобы найти это. Любая автономная программа в зависимости от стоимости$PWD
будет ненадежной.