Який сенс зовнішньої команди `cd`?


71

Як посилається на цю точну відповідь , у 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. Так само, як і всі інші. :)
kojiro

Відповіді:


64

Він служить насамперед для того, щоб переконатися, що скринька інструментів POSIX доступна як усередині, так і зовні оболонки (див. Обґрунтування POSIX для їх використання ).

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

Приклад:

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

Ще одним потенційним побічним ефектом є автоматичне створення каталогу.

У кількох системах більшість зовнішніх команд для стандартних вбудованих оболонок реалізовані як символьне посилання на той самий сценарій, що і:

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

Тобто запустіть оболонку і запустіть вбудований в ній.

Деякі інші системи (наприклад, GNU) мають утиліти як справжні виконувані команди, що може призвести до плутанини, коли поведінка відрізняється від оболонки, вбудованої у версію.


2
+1 для спостереження за побічними ефектами та повідомленнями про помилки. Новим користувачам не завжди добре пояснюється, що багато розумних ідіом в Unix походять від ретельного використання побічних ефектів. І самі довідкові сторінки ніколи не були добрі в описі більшої картини.
RBerteig

Прийшов сюди з аналогічного запитання про SO, чи можете ви пояснити, що ви маєте на увазі, коли ви говорите "автоматичне управління каталогом"?
ffledgling


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.