Расположение исполняемого файла cd - PullRequest
7 голосов
/ 18 сентября 2010

Я прочитал, что исполняемые файлы для команд, выполненных с использованием вызовов exec (), должны храниться в каталогах, которые являются частью переменной PATH.

Соответственно, я нашел исполняемые файлы для ls, chmod, grep, cat в /bin.

Однако я не смог найти исполняемый файл для cd.

Где это находится?

Ответы [ 7 ]

21 голосов
/ 18 сентября 2010

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

7 голосов
/ 18 сентября 2010

Не все утилиты, которые вы можете запустить по приглашению оболочки, на самом деле должны существовать как фактические исполняемые файлы в файловой системе. Они также могут быть так называемыми встроенными оболочками , что означает & ndash; Вы догадались, & ndash; что они встроены в оболочку.

Спецификация Single Unix, как правило, не указывает, должна ли служебная программа предоставляться как исполняемый файл или как встроенная, которая оставляется как частная внутренняя деталь реализации поставщику ОС. .

Единственными исключениями являются так называемые специальные встроенные модули , которые должны быть предоставлены как встроенные, поскольку они влияют на поведение Оболочка сама таким образом, что обычные исполняемые файлы (или даже обычные встроенные модули) не могут (например, set, который устанавливает переменные, которые сохраняются даже после выхода set). Эти специальные встроенные модули:

  • break
  • :
  • continue
  • .
  • eval
  • exec
  • exit
  • export
  • readonly
  • return
  • set
  • shift
  • times
  • trap
  • unset

Обратите внимание, что cd - это , а не в этом списке, что означает, что cd не является специальной встроенной функцией. Фактически, в соответствии со спецификацией было бы совершенно законно реализовать cd как обычный исполняемый файл. Это просто невозможно по причинам, указанным в других ответах.

И если вы прокрутите вниз до ненормативного раздела спецификации, то есть до части, которая официально не является частью спецификации, но является чисто информационной, вы обнаружите, что этот факт явно упоминается:

Поскольку cd влияет на текущую среду выполнения оболочки, он всегда предоставляется как обычная встроенная оболочка .

Итак, спецификация не требует, чтобы cd был встроенным, но просто невозможно сделать иначе.

Обратите внимание, что иногда утилиты предоставляются как встроенные и как исполняемый файл. Хорошим примером является утилита time, которая в типичной системе GNU предоставляется как исполняемый пакет Coreutils и как обычная встроенная оболочка Bash. Это может привести к путанице, потому что когда вы делаете man time, вы получаете man-страницу исполняемого файла time (встроенная функция time описана в man builtins), но когда вы выполняете time, вы получаете time встроенный, который не поддерживает те же функции, что и исполняемый файл time, справочную страницу которого вы только что прочитали. Вы должны явно запустить /usr/bin/time (или любой другой путь, по которому вы установили Coreutils), чтобы получить исполняемый файл.

7 голосов
/ 18 сентября 2010

CD - это встроенная оболочка, к сожалению.

$ type cd
cd is a shell builtin

... из http://www.linuxquestions.org/questions/linux-newbie-8/whereis-cd-sudo-doesnt-find-cd-464767/

Но вы должны иметь возможность работать с:

sh -c "cd /somedir; do something"
2 голосов
/ 18 сентября 2010

Команда cd встроена в оболочку командной строки.В противном случае это не может повлиять на рабочий каталог вашей оболочки.

2 голосов
/ 18 сентября 2010

cd является частью оболочки;внутренняя команда.Для него нет двоичного кода.

2 голосов
/ 18 сентября 2010

Согласно это , cd всегда является встроенной командой, а никогда - исполняемым:

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

0 голосов
/ 20 марта 2011

Я также искал исполняемый файл "cd", и такого нет. Вы можете работать с chdir (pathname) в C, это имеет тот же эффект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...