Ich habe mich immer gefragt, warum cd
es kein Programm gibt, aber ich habe es nie geschafft, die Antwort zu finden.
Weiß jemand, warum das so ist?
shell
command
cd-command
shell-builtin
AkshaiShah
quelle
quelle
cd
Befehl ein separates Programm war. Die Schale behandelt es speziell, dass sie tat es nichtfork
, einfachexec
. Und wenncd
es fertig war, würde es exekutierensh
. Ich weiß nicht, ob dies eine wahre Geschichte ist.chdir
Syscall aufrufen . Quellen: v1 v5 v7 (erste Version mit Bourne-Shell)cd
, die ich gelesen hatte. Ich habe mich eindeutig geirrt, nachdem @jlliagre die Details ausgefüllt hat.Antworten:
Der
cd
Befehl ändert das "aktuelle Arbeitsverzeichnis", richtig?"aktuelles Arbeitsverzeichnis" ist eine Eigenschaft, die für jeden Prozess eindeutig ist.
Wenn also
cd
ein Programm wäre, würde es so funktionieren:cd foo
cd
Prozess beginntcd
Prozess ändert das Verzeichnis für den CD-Prozesscd
Prozess wird beendetquelle
cd
ein Programm so funktionieren würde" sollte "wenncd
es in seiner externen Programmimplementierung verwendet wird, funktioniert es so" lauten .cd
ist nicht nur eine eingebaute Shell, sondern auch ein Programm für POSIX-kompatible Betriebssysteme. Sie müssen unabhängige ausführbare Dateien für reguläre Dienstprogramme wie bereitstellencd
. Dies ist beispielsweise bei Solaris , AIX , HP-UX und OS X der Fall .Ein Builtin
cd
ist natürlich immer noch obligatorisch, da seine externe Implementierung das aktuelle Shell-Verzeichnis nicht ändert. Letzteres kann jedoch immer noch nützlich sein. Das folgende Beispiel zeigt, wie POSIX die Verwendung diesescd
Befehls vorstellt :Auf einem POSIX-System meldet dieser Oneliner eine Fehlermeldung für alle Verzeichnisse, in denen Sie nicht zugelassen sind
cd
. Bei den meisten Gnu / Linux-Distributionen schlägt diese Fehlermeldung jedoch fehl:Und hier ist die Antwort auf Ihre Frage: " Warum ist CD kein Programm? ", Von einem der ursprünglichen Unix-Co-Autoren. Bei einer sehr frühen Unix-Implementierung war
cd
(chdir
zu dieser Zeit geschrieben) ein externes Programm. Es hat nur unerwartet aufgehört zu funktionieren, nachdemfork
es zum ersten Mal implementiert wurde.Zitat von Dennis Ritchie :
Quelle: Dennis M. Ritchie, „ Die Entwicklung des Unix-Timesharing-Systems “, AT & T Bell Laboratories, Technical Journal 63 (6), Teil 2, Oktober 1984, S. 1577–93
Unix-Version 1 (März 1971) Die Handbuchseite von chdir lautet:
Da ein neuer Prozess erstellt wird, um jeden Befehl auszuführen, wäre chdir ineffektiv, wenn es als normaler Befehl geschrieben würde. Es wird daher von der Shell erkannt und ausgeführt.
quelle
cd
ausführbare Datei geben soll, diese aber nichts tun soll (außer möglicherweise Fehlermeldungen ausgeben, wenn sie mit den falschen Argumenten aufgerufen werden). Seltsam.Aus der Bash-Einführung ( Was ist eine Shell? ):
quelle
Für Aprilscherz in diesem Jahr habe ich eine eigenständige Version von geschrieben
cd
.Niemand hat den Witz verstanden. Seufzer.
Jeder, der nicht sicher ist, ob
cd
dies in die Shell integriert werden muss, sollte es herunterladen, erstellen und ausprobieren.Lesen Sie auch die Manpage. :)
quelle
/bin/cd
. Wenn Sie meinen Code nehmen und dies zu Ihrer persönlichen Aufgabe machen möchten, können Sie dies gerne tun.Der
cd
Befehl in der Shell kann kein separater Prozess sein, da es in Unix keinen Mechanismus zum Ändern des aktuellen Arbeitsverzeichnisses eines anderen Prozesses gibt (nicht einmal des übergeordneten Prozesses).Wenn dies
cd
ein anderer Prozess wäre, müsste das aktuelle Arbeitsverzeichnis des übergeordneten Elements (Shell) geändert werden, was unter Unix nicht möglich ist. Stattdessencd
ist ein spezieller Befehl eingebaut. Die Shell ruft Funktionen aufchdir()
undfchdir()
ändert ihr eigenes aktuelles Arbeitsverzeichnis.Hinweis: Der Kernel speichert für jeden Prozess die Inode-Nummer des aktuellen Arbeitsverzeichnisses. Der untergeordnete Prozess erbt ihn
cwd
von seinem übergeordneten Prozess .quelle
cd ist ein Shell-Befehl. So einfach wie es ist. Die CD des Mannes sagt alles. Der Befehl cd ändert das Arbeitsverzeichnis für alle Interpreter und (in einer Thread-Umgebung) für alle Threads.
quelle
cd
eingebaut ist. Ich würde vorschlagen, dass Sie die bestplatzierten Antworten lesen und überlegen, wie Sie Ihre Antwort verbessern können.Ich denke, eine Sache, die in der Antwort der Leute fehlt, ist, dass das aktuelle Verzeichnis eine Umgebungsvariable ist, die jedes Programm ändern kann. Wenn Sie den Befehl 'export' verwenden, um die Liste Ihrer aktuellen Umgebungsvariablen anzuzeigen, haben Sie Folgendes:
in Ihren Ergebnissen. Mit dem Befehl 'cd' wollen wir also nur diese interne Variable ändern. Ich denke, wenn wir es versuchen, können wir natürlich die PWD-Variable jeder Pty in der Shell ändern. Mögen:
Aber ich denke, es gibt im Normalfall keine Notwendigkeit. Mit anderen Worten, wir nehmen die Hilfe von bash (oder einer beliebigen Shell) in Anspruch, um die interne Variable zu ändern, die definiert wurde.
quelle
..
Pfad, nicht der Weg begann Sie es aus:#include <stdlib.h>
int main(void) { chdir(".."); puts(getenv("PWD")); }
(C Schalen der CWD als% cwd aussetzen statt, übrigens.)#include <unistd.h>
int main(void) { char ac[99]; setenv("PWD", "/", 1); puts(getcwd(ac, sizeof(ac))); }
Es wird das Verzeichnis angezeigt, von dem aus Sie das Programm gestartet haben, nicht/
.$PWD
die Bourne-Shell nur eine Bedeutung hat. Es ist nur eine Möglichkeit für die Shell, Shell-Skripten etwas mitzuteilen, das sie kennt, damit sie nicht aufrufen müssenpwd
, um es zu finden. Jedes eigenständige Programm, das vom Wert von$PWD
abhängt, ist unzuverlässig.