В каком пакете находится команда 'cd'?
Я хочу заглянуть в исходный код команды cd
, но cd
Кажется, у него нет своего пакета, так в каком пакете он находится?
5 ответов
Узнайте, какой тип команда использует type
команда.
$ type cd
cd is a shell builtin
$ type ls
ls is aliased to `ls --color=auto'
$ type cat
cat is /bin/cat
Ты можешь видеть, cd
это встроенная оболочка
Это означает, что это часть вашей оболочки, которая по умолчанию является Bash. Это, конечно, также программный пакет, в котором он содержится.
Для установленных команд, которые не являются встроенными командами оболочки, но исполняемыми файлами, используйте dpkg -S
выяснить посылку:
$ dpkg -S $(which cat)
coreutils: /bin/cat
Чтобы получить помощь по встроенным командам, используйте help
команда (которая также встроена):
$ help cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
[... output shortened ...]
cd
обязательно встроенная оболочка. Если оболочка порождает дочерний процесс, который изменил рабочий каталог и затем вышел, родительский процесс (сама оболочка) не будет затронут.
Что касается исходного кода cd
все, что нужно сделать, это позвонить chdir(2)
, который меняет рабочий каталог процесса. Смотрите chdir на opengroup.org, где говорится:
Функция chdir() должна заставить каталог с именем pathname, на который указывает аргумент path, стать текущим рабочим каталогом; то есть, отправная точка для поиска пути для имен пути, не начинающихся с '/'.
Вот справочная страница для CD, но она не является официальной, поскольку cd
является частью "Команды встроенной оболочки". Как и некоторые другие команды...
alias, bg, bind, break, builtin, command, compgen, complete,
continue, declare, dirs, disown, echo, enable, eval, exec, exit,
export, fc, fg, getopts, hash, help, history, jobs, kill, let, local,
logout, popd, printf, pushd, pwd, read, readonly, return, set, shift,
shopt, source, suspend, test, times, trap, type, typeset, ulimit,
umask, unalias, unset, wait
Смотрите страницу руководства для bash. По ссылке cd
состояния:
cd [-L | -P] [dir]
Измените текущий каталог на dir. Переменная HOME является каталогом по умолчанию. Переменная CDPATH определяет путь поиска для каталога, содержащего dir. Альтернативные имена каталогов в CDPATH разделяются двоеточием (:). Нулевое имя каталога в CDPATH совпадает с текущим каталогом, т. Е. ''.''. Если dir начинается с косой черты (/), то CDPATH не используется. Опция -P говорит об использовании физической структуры каталогов вместо символьных ссылок (см. Также опцию -P для встроенной команды set); опция -L заставляет следовать символическим ссылкам. Аргумент - эквивалентен $OLDPWD. Если используется непустое имя каталога из CDPATH, или если - первый аргумент, и изменение каталога прошло успешно, абсолютный путь нового рабочего каталога записывается в стандартный вывод. Возвращаемое значение равно true, если каталог был успешно изменен; ложь в противном случае.
В каком пакете находится команда 'cd'?
Это было бы Баш
Фактический исходный код cd
для
- Баш в
builtins/cd.def
в конце файла - TCSH в
sh.dir.c
как функцияdochngd
- PDKSH ( Оболочка Public Domain Korn, найденная в некоторых BSD) в
c_ksh.c
прямо в верхней части файла - Корн 93 (Оригинальная оболочка Корн, старая версия) в
src/cmd/ksh93/bltins/cd_pwd.c
Системный вызов chdir
за
- Ядро Linux находится в
fs/open.c
- FreeBSD - это то, где ссылка в начале этого пункта указывает на
- другие ОС типа BSD и OpenSolaris работают очень похоже
Следует отметить, что системные вызовы по-прежнему не являются концом цепочки, которые были бы недоступны на уровне отдельной файловой системы.
Правильно, так как все написали, cd
встроен в любую оболочку, которую вы используете, потому что процесс не может влиять на рабочий каталог своего родителя. cd
имеет несколько наворотов, прикрепленных (я имею в виду pushd
и друзья, cd
без аргументов и т. д.), но если вы попытаетесь покопаться в источнике, вы будете поражены: главное, что cd
вызывает chdir(2)
системный вызов.
Там не так много, чтобы увидеть, потому что, в отличие от, скажем, переменная среды HOME
"рабочий каталог" является системным примитивом: это один из атрибутов, которые имеет каждый процесс, например (реальный) идентификатор пользователя или приоритет планирования. Это отправная точка при открытии файлов с относительными путями.