Jaki jest sens polecenia zewnętrznego `cd`?

71

Jak wspomniano w tej dokładnej odpowiedzi , systemy POSIX mają wbudowany zewnętrzny plik binarny cdoprócz wbudowanej powłoki. W OS X 10.8 jest to /usr/bin/cd. Nie możesz używać go jak wbudowanego, cdponieważ wychodzi on natychmiast po zmianie własnego katalogu roboczego. Do czego to służy?

kojiro
źródło
Zauważ, że Ubuntu i CentOS (a zatem prawdopodobnie Red Hat) nie mają /usr/bin/cd, tylko wbudowaną powłokę.
Keith Thompson,
1
Moja Fedora 19 zawiera /bin/cdjednak.
slm
1
Debian (sprawdziłem kilka wydań, w tym bieżące testy) nie ma /bin/cdani /usr/bin/cd.
derobert
1
Myślę, że to sprawia, że ​​systemy te nie są w pełni POSIX. Tak jak wszyscy inni. :)
kojiro

Odpowiedzi:

64

Służy przede wszystkim do upewnienia się, że skrzynka narzędzi POSIX jest dostępna zarówno wewnątrz, jak i na zewnątrz powłoki (patrz uzasadnienie POSIX, aby je wymagać ).

Bo cdto nie jest niezwykle przydatne, ale należy pamiętać, że cdzmienia katalogi, ale ma inne skutki uboczne: zwraca status wyjścia, który pomaga ustalić, czy możesz przejść chdir()do tego katalogu, czy nie, i wyświetla przydatny komunikat o błędzie wyjaśniający, dlaczego nie możesz chdir()kiedy nie możesz.

Przykład:

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

Innym potencjalnym efektem ubocznym jest automatyczne montowanie katalogu.

W kilku systemach większość zewnętrznych poleceń dla standardowych wbudowanych powłok jest zaimplementowana jako dowiązanie symboliczne do tego samego skryptu, który:

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

To jest uruchom powłokę i uruchom wbudowane w nią.

Niektóre inne systemy (takie jak GNU) mają narzędzia jako prawdziwe polecenia, które mogą prowadzić do nieporozumień, gdy zachowanie różni się od wbudowanej wersji powłoki.

Stéphane Chazelas
źródło
2
+1 za obserwację na temat skutków ubocznych i komunikatów o błędach. Nowi użytkownicy nie zawsze dobrze wyjaśniają, że wiele sprytnych idiomów w Uniksie pochodzi z ostrożnego stosowania efektów ubocznych. A same strony podręcznika nigdy nie były dobre w opisywaniu większego obrazu.
RBerteig
Przyszedłeś tutaj z podobnego pytania na temat SO, czy mógłbyś rozwinąć to, co masz na myśli mówiąc „automatyczne montowanie katalogu”?
ffledgling
1
@ffledgling, patrz en.wikipedia.org/wiki/Automounter
Stéphane Chazelas
1
Aby trochę rozpakować myśl Stéphane'a Chazelasa: jeśli chcesz upewnić się, że katalog automatyczny jest faktycznie zamontowany bez dokonywania w nim żadnych zmian i bez próby odczytu jakichkolwiek plików, możesz użyć cdpolecenia zewnętrznego . Może być przydatny w monitorowaniu dostępności zdalnie montowanego systemu plików, a może przed zrobieniem czegoś krytycznego czasowo.
telcoM
11

Fakt non wbudowanego polecenia cd dostępna jest w istocie ze względu na POSIX wymogiem dla wszystkich regularnych builtins być wpłacone przez Exec poleceń rodzinnych env, find, nice, nohup, timei xargsprzyczyniły się do faktu, niektóre z tych poleceń nie są sami realizowanego jako poleceń wbudowanych.

Nie ma to jednak większego sensu, cdponieważ połączenie go z tymi poleceniami jest zupełnie bezcelowe. Oto jednak mniej lub bardziej dające się obronić przykłady:

find . -type d -exec cd {} \;
env HOME=/foo cd
jlliagre
źródło
2
Wiele wbudowanych jest faktycznie zwolnionych z tej reguły . Co dziwne, cd nie jest jednym z nich.
Kevin,
5
@Kevin Napisałem, że jest to wymóg dla wszystkich zwykłych poleceń wbudowanych , zwolnione są specjalnymi funkcjami wbudowanymi : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetbyłyby nieistotne jako polecenia zewnętrzne, podczas gdy cdsą to zwykłe polecenia wbudowane, które mają kilka udokumentowanych przypadków użycia jako polecenia.
jlliagre
1

Oprócz sprawdzenia, czy ścieżka odpowiada dostępnemu katalogowi, cdplik wykonywalny przetworzy i użyje CDPATHzmiennej oraz wydrukuje bezwzględną ścieżkę rozstrzygniętego katalogu, jeśli został on pomyślnie użyty.

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

Jest to bardzo okazjonalnie przydatne, ale zaoszczędziłoby ponownego wprowadzania tej samej logiki do wyszukiwania pasujących katalogów. Konkretnym przypadkiem użycia jest znalezienie pierwszego istniejącego katalogu określonego nazwiska pod kilkoma możliwymi rodzicami.

cdprzetwarza również OLDPWDza cd -, ale to jest mniej konkretnie użyteczne, gdyż zmienna będzie już dostępny.

Michael Homer
źródło