Wozu dient der Befehl "cd" external?

71

In dieser guten Antwort wird darauf verwiesen , dass POSIX-Systeme cdzusätzlich zur integrierten Shell eine externe Binärdatei haben. Unter OS X 10.8 ist es /usr/bin/cd. Sie können es nicht wie das eingebaute Programm verwenden, cdda es sofort nach dem Ändern des eigenen Arbeitsverzeichnisses beendet wird. Welchem ​​Zweck dient es?

Kojiro
quelle
Beachten Sie, dass Ubuntu und CentOS (und daher vermutlich Red Hat) nicht über /usr/bin/cdnur die integrierte Shell verfügen .
Keith Thompson
1
Mein Fedora 19 enthält /bin/cdjedoch.
SLM
1
Debian (ich habe mehrere Releases geprüft, einschließlich aktueller Tests) hat weder /bin/cdnoch /usr/bin/cd.
Derobert
1
Ich denke, das macht diese Systeme nicht unbedingt POSIX. Genau wie jeder andere. :)
Kojiro

Antworten:

64

Dies dient in erster Linie dazu, sicherzustellen, dass die POSIX-Werkzeugkiste sowohl innerhalb als auch außerhalb einer Shell verfügbar ist (Informationen dazu finden Sie im POSIX-Grundprinzip ).

Denn cd, das ist nicht enorm nützlich , aber beachten Sie, dass cdVerzeichnisse ändert aber auch andere Nebenwirkungen hat: es gibt einen Exit - Status , das bestimmen hilft , ob Sie in der Lage sind , chdir()auf das Verzeichnis oder nicht, und gibt eine nützliche Fehlermeldung zu erklären , warum können Sie nicht chdir()wenn du nicht kannst.

Beispiel:

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

Ein weiterer möglicher Nebeneffekt ist die automatische Bereitstellung eines Verzeichnisses.

Auf einigen wenigen Systemen sind die meisten externen Befehle für die Standard-Shell-Buildins als Symlink zu demselben Skript implementiert, das Folgendes ausführt:

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

Das heißt eine Shell starten und das eingebaute darin ausführen.

Einige andere Systeme (wie GNU) haben Dienstprogramme als echte ausführbare Befehle, die zu Verwirrungen führen können, wenn sich das Verhalten von der in der Shell eingebauten Version unterscheidet.

Stéphane Chazelas
quelle
2
+1 für die Beobachtung von Nebenwirkungen und Fehlermeldungen. Neuen Benutzern wird nicht immer gut erklärt, dass viele clevere Redewendungen in Unix auf dem sorgfältigen Umgang mit Nebenwirkungen beruhen. Und die Manpages selbst waren noch nie gut darin, das Gesamtbild zu beschreiben.
RBerteig
Kam hier von einer ähnlichen Frage auf SO, könnten Sie erläutern, was Sie meinen, wenn Sie sagen "automounting eines Verzeichnisses"?
ffledgling
1
@ffledgling, siehe en.wikipedia.org/wiki/Automounter
Stéphane Chazelas
1
Um den Gedanken von Stéphane Chazelas ein wenig zu entpacken: Wenn Sie sicherstellen möchten, dass ein automoutable-Verzeichnis tatsächlich bereitgestellt wird, ohne Änderungen daran vorzunehmen und ohne zu versuchen, Dateien zu lesen, können Sie den externen cdBefehl verwenden. Dies kann hilfreich sein, um die Verfügbarkeit eines automountbaren Remote-Dateisystems zu überwachen, oder bevor Sie mit einem Dateisystem eine zeitkritische Aktion ausführen.
TelcoM
11

Die Tatsache , ein nicht builtin Befehl cd verfügbar ist , ist im Wesentlichen auf die POSIX - Anforderung für alle regulären builtins durch die exec Familie Befehle aufrufbar sein env, find, nice, nohup, timeund xargseinige dieser Befehle auf die Tatsache kombiniert werden sich nicht als builtins umgesetzt.

Das macht allerdings nicht viel Sinn, cdda es ziemlich sinnlos ist, es mit diesen Befehlen zu kombinieren. Hier sind mehr oder weniger haltbare Beispiele:

find . -type d -exec cd {} \;
env HOME=/foo cd
jlliagre
quelle
2
Einige eingebaute Funktionen sind von dieser Regel ausgenommen . Seltsamerweise gehört CD nicht dazu.
Kevin
5
@ Kevin Ich habe geschrieben, es ist eine Voraussetzung für alle regulären Buildins , die Ausgenommenen sind spezielle Buildins : break, :, continue, . , eval, exec, exit, export, readonly, return, set, shift, times, trap, unsetwären als externe Befehle irrelevant, während cdes sich um ein reguläres Buildin handelt, das einige dokumentierte Anwendungsfälle als Befehl enthält.
Juli
1

Zusätzlich zur Überprüfung, ob ein Pfad einem zugänglichen Verzeichnis entspricht, cdverarbeitet und verwendet die ausführbare Datei die CDPATHVariable und gibt bei erfolgreicher Verwendung den absoluten Pfad des aufgelösten Verzeichnisses aus.

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

Dies ist nur sehr gelegentlich nützlich, würde jedoch die Neuimplementierung derselben Logik für die Suche nach passenden Verzeichnissen ersparen. Ein konkreter Anwendungsfall besteht darin, das erste vorhandene Verzeichnis eines bestimmten Namens unter mehreren möglichen Eltern zu finden.

cdauch Prozesse OLDPWDfür cd -, aber das ist weniger konkret sinnvoll, da die Umgebungsvariable bereits verfügbar wäre.

Michael Homer
quelle