В чем смысл внешней команды `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
@ffledgling, см. en.wikipedia.org/wiki/Automounter
Стефан Шазелас
1
Чтобы немного распаковать Стефана Шазеласа, нужно подумать: если вам нужно убедиться, что автомобильный каталог действительно смонтирован, не внося в него никаких изменений и не пытаясь прочитать какие-либо файлы, вы можете использовать внешнюю cdкоманду. Может быть полезно для мониторинга доступности автоматически монтируемой удаленной файловой системы или, возможно, перед тем, как сделать с ней что-то критическое по времени.
TelcoM
11

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

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

find . -type d -exec cd {} \;
env HOME=/foo cd
jlliagre
источник
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 -, но это менее конкретно полезно, поскольку переменная окружения уже будет доступна.

Майкл Гомер
источник