Почему cd не является программой?

Я всегда задавался вопросом, почему cd не является программой, но так и не смог найти ответ.

Кто-нибудь знает, почему это так?

115 голосов | спросил AkshaiShah 16 Maypm12 2012, 23:39:06

7 ответов


162

Команда cd изменяет «текущий рабочий каталог», правильно?

«текущий рабочий каталог» - это свойство, уникальное для каждого процесса.

Итак, если cd была программой, она будет работать следующим образом:

  1. cd foo
  2. запускается процесс cd
  3. процесс cd изменяет каталог для процесса cd
  4. завершается процесс cd
  5. ваша оболочка все еще имеет одно и то же состояние, включая текущий рабочий каталог, который он сделал до того, как вы начали.
ответил Daniel Pittman 16 Maypm12 2012, 23:41:08
97

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

И вот ответ на ваш вопрос: « Почему cd не является программой? » одним из оригинальных соавторов Unix. В очень ранней версии Unix, cd (пишется chdir в то время) была внешней программой. Он просто прекратил работать неожиданно после того, как fork был впервые реализован.

Цитата Деннис Ричи :

  

В разгар нашего ликования было обнаружено, что команда chdir (change current directory) перестала работать. Было много чтения кода и тревожной интроспекции о том, как добавление вилки могло нарушить вызов chdir. Наконец-то поняла правда: в старой системе хдир был обычной командой; он скорректировал текущий каталог (уникальный) процесс, подключенный к терминалу. В новой системе команда chdir корректно изменила текущий каталог процесса, созданного для его выполнения, но этот процесс немедленно прекратился и не имел никакого влияния на его родительскую оболочку! Необходимо было сделать chdir специальной командой, выполненной внутри оболочки. Оказывается, что несколько командно-подобных функций имеют одно и то же свойство, например login.

Источник: Деннис М. Ричи, Эволюция системы разделения времени Unix , AT & T Технический журнал Bell Laboratories 63 (6), часть 2, октябрь 1984 г., стр.1577 - 93

Unix Version 1 (март 1971) chdir страница руководства :

Поскольку для выполнения каждой команды создается новый процесс, chdir был бы неэффективен, если бы он был написан как нормальный команда. Поэтому оно признается и выполняется Shell.

ответил jlliagre 17 Mayam12 2012, 00:44:24
45

Из введения Bash ( Что такое оболочка? ):

  

Корпуса также предоставляют небольшой набор встроенных команд (встроенных)   невозможность или неудобство   отдельные утилиты. Например, cd, break, continue и   exec) не могут быть реализованы за пределами оболочки, потому что они   непосредственно манипулировать самой оболочкой. history, getopts,   kill или pwd, среди прочих, могут быть реализованы в   отдельные утилиты, но удобнее их использовать как встроенные   команды. Все оболочки встроены в последующие   разделы.

ответил cjc 17 Mayam12 2012, 00:03:41
28

В апреле этого года я написал отдельную версию cd .

Никто не получил шутку. Вздох.

Любой, кто не уверен, что cd должен быть встроен в оболочку, должен загрузить его, построить и попробовать.

Прочтите его страницу руководства. :)

ответил Warren Young 17 Mayam12 2012, 05:09:49
4

Команда cd в оболочке не может быть отдельным процессом, потому что в Unix нет механизма для изменения текущего рабочего каталога другого процесса (даже не родительского процесса).

Если cd был другим процессом, тогда ему пришлось бы изменить текущий рабочий каталог его родительского (shell), который невозможен в Unix. Вместо этого cd является специальной встроенной командой. Оболочка вызывает такие функции, как chdir() и fchdir(), изменяя свой собственный текущий рабочий каталог.

Примечание. Ядро хранит номер inode текущего рабочего каталога для каждого процесса. Детский процесс наследует его cwd от своего родителя.

ответил saurav1405 27 J0000006Europe/Moscow 2015, 10:23:26
0

cd - встроенная команда оболочки. Как легко. Мужчина cd говорит все. команда cd изменяет рабочий каталог для всех интерпретаторов и (в потоковой среде) все потоки.

ответил 17 Mayam12 2012, 03:34:34
-1

Я думаю, что одна вещь, отсутствующая в ответе людей, заключается в том, что текущий каталог - это переменная среды, которую каждая программа может изменить. Если вы используете команду «экспорт», чтобы просмотреть список текущих переменных среды, у вас будет:

declare -x PWD="/home/erfan"

в ваших результатах. Таким образом, командой 'cd' мы просто хотим изменить эту внутреннюю переменную. Я думаю, что если мы попробуем, мы можем, конечно, перечислить переменную PWD любого pty в оболочке. Как:

cder    #change current PTY $PWD variable

Но я думаю, что в обычных случаях нет необходимости. В другом слове мы берем справку bash (или любой оболочки) для изменения ее внутренней переменной.

ответил Erfankam 17 Maypm12 2012, 17:26:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132