В чем смысл внешней команды `cd`?


72

Как указано в этом прекрасном ответе , системы POSIX имеют внешний двоичный файл cdв дополнение к встроенной оболочке. На OS X 10.8 это так /usr/bin/cd. Вы не можете использовать его как встроенный, cdтак как он выходит сразу после изменения своего рабочего каталога. Какой цели это служит?


Обратите внимание, что в Ubuntu и CentOS (и, следовательно, предположительно, в Red Hat) нет /usr/bin/cdтолько встроенной оболочки.
Кит Томпсон

1
Моя Fedora 19 включает /bin/cdоднако.
SLM

1
Debian (я проверял несколько выпусков, включая текущее тестирование) не имеет ни того, /bin/cdни другого /usr/bin/cd.
Дероберт

1
Я думаю, что делает эти системы не строго POSIX. Как и все остальные. :)
Кодзиро

Ответы:


65

Он служит главным образом для того, чтобы убедиться, что сундук с инструментами POSIX доступен как внутри, так и снаружи оболочки (см. Обоснование POSIX ).

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

Пример:

dirs_i_am_able_to_cd_into=$(find . -type d -exec cd {} \; -print)

Другим потенциальным побочным эффектом является автомонтирование каталога.

В некоторых системах большинство внешних команд для стандартных встроенных оболочек реализовано в виде символической ссылки на тот же сценарий, который выполняет:

#! /bin/sh -
"${0##*/}" "$@"

То есть запустить оболочку и запустить встроенную в нее.

Некоторые другие системы (например, GNU) имеют утилиты как настоящие исполняемые команды, которые могут привести к путанице, когда поведение отличается от встроенной версии оболочки.


3
+1 за наблюдение о побочных эффектах и ​​сообщениях об ошибках. Новым пользователям не всегда хорошо объясняется, что многие умные идиомы в Unix происходят от осторожного использования побочных эффектов. И сами страницы руководства никогда не умели описывать общую картину.
RBerteig

Пришел сюда из аналогичного вопроса о SO, не могли бы вы уточнить, что вы имеете в виду, когда говорите «автомонтирование каталога»?
окопался


1
Чтобы немного распаковать Стефана Шазеласа, нужно подумать: если вам нужно убедиться, что автомобильный каталог действительно смонтирован, не внося в него никаких изменений и не пытаясь прочитать какие-либо файлы, вы можете использовать внешнюю cdкоманду. Может быть полезно для мониторинга доступности автоматически монтируемой удаленной файловой системы или, возможно, перед тем, как сделать с ней что-то критическое по времени.
TelcoM

11

Тот факт , встроенная команда не компакт - диска доступна в основном в связи с POSIX требования для всех регулярных встроенных команд , чтобы быть отозваны по EXEC команд семьи env, find, nice, nohup, timeи в xargsсочетании с тем , некоторые из этих команд не сами реализованы в виде встроенных команд.

Это не имеет особого смысла, cdхотя объединять его с этими командами совершенно бессмысленно. Вот более или менее надежные примеры:

find . -type d -exec cd {} \;
env HOME=/foo cd

2
Многие встроенные модули на самом деле освобождены от этого правила . Странно, CD не один из них.
Кевин

5
@Kevin Я написал, что это требование для всех обычных встроенных функций , исключенные из них являются специальными встроенными : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetони не будут иметь отношения к внешним командам, а cdявляются обычными встроенными, в которых есть несколько документированных вариантов использования в качестве команды.
Jlliagre

1

В дополнение к проверке, соответствует ли путь доступному каталогу, cdисполняемый файл обработает и использует CDPATHпеременную и выведет абсолютный путь к разрешенному каталогу, если он был использован успешно.

$ export CDPATH=/usr
$ echo bin lib | xargs -n 1 cd
/usr/bin
/usr/lib

Это очень редко полезно, но спасает повторную реализацию той же логики для поиска подходящих каталогов. Конкретный вариант использования - это поиск первого существующего каталога с определенным именем под несколькими возможными родителями.

cdтакже процессы OLDPWDдля cd -, но это менее конкретно полезно, поскольку переменная окружения уже будет доступна.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.