Ist der Konsolenbefehl „cd“ eine Art Platzhalter?

Ist der Konsolenbefehl „cd“ eine Art Platzhalter?

Ich habe mich beim Entwickeln einer Anwendung gefragt (obwohl dies keine Entwicklungsfrage ist), ob der cdin Windows verwendete Befehl eine Art Platzhalter oder plattformübergreifender Befehl ist. Ich habe in einer Tabelle mit Befehlen für Unix/Linux und MAC OS X nachgesehen und es stellte sich heraus, dass er dort zu sein scheint. Ich bin kein Multi-OS-Benutzer, also frage ich, ob mir jemand mit Erfahrung mit verschiedenen Betriebssystemen Folgendes sagen kann:

  1. Wenn dieser Befehl wirklich existiert und funktioniert
  2. Wenn es die gleiche Funktionalität hat (Verzeichnis wechseln)
  3. Wenn bei der Verwendung Probleme auftreten
  4. Wenn es in einem beliebigen Betriebssystem einen anderen Befehlszeilenbefehl gibt, der dasselbe auf eine bessere/ausgefeiltere/häufiger verwendete Weise tut.

Dank im Voraus!

(PSI bin nicht 100 % sicher, ob diese Frage zu dieser Site oder einer anderen Stackexchange-Site gehört …)

(PPS: Jede Hilfe beim Taggen wird geschätzt!)

Antwort1

Wenn dieser Befehl wirklich existiert und funktioniert

Ähm, ja, das gibt es und es funktioniert.

Wenn es die gleiche Funktionalität hat (Verzeichnis wechseln)

Ja, das tut es. Das heißt nicht, dass jemand nicht einfach ein Programm (z. B. cd.exe) erstellen könnte, das etwas anderes macht, aber normalerweise handelt es sich dabei um einen in die Shell integrierten Befehl, der das aktuelle Verzeichnis ändert.

Wenn bei der Verwendung Probleme auftreten

Welche Art von Problemen? Im Gegensatz zu .und ..ist die Syntax ziemlich unkompliziert. Die einzige Komplikation besteht beim Ändern des aktuellen Verzeichnisses auf anderen Datenträgern (Laufwerksbuchstaben). Außerdem erweitern die Befehlserweiterungen in Windows die Verwendung geringfügig, aber nichts, was echte Probleme verursachen würde.

Wenn es in einem beliebigen Betriebssystem einen anderen Befehlszeilenbefehl gibt, der dasselbe auf eine bessere/ausgefeiltere/häufiger verwendete Weise tut.

Nicht wirklich. Es kann andere Befehle geben, aber dieser ist schön kurz und erfüllt seinen Zweck. Wie könnte man das Ändern des aktuellen Verzeichnisses verbessern, cdaußer zusätzlich zum Verzeichnis das aktuelle Laufwerk zu ändern (z. B. )?cd /d t:\blah


Dies ist nicht ganz themenbezogen (obwohl es damit zusammenhängt), aber anscheinend können einige Leute nicht akzeptieren, dass der CDBefehl nichthabenin die Schale eingebaut werden. Tatsache ist, dass esnicht; Esdürfenein externes Programm sein. Einige Betriebssysteme machen es einfach, andere machen es schwierig und manche machen es vielleicht sogar unmöglich, aber Tatsache ist, dass esdürfenextern sein und nichtmüssen immer eingebaut werdenwie manche Sie glauben machen wollen. Beispielsweise können Sie bei 32-Bit-Versionen von Windows, einschließlich XP und 7, die Tatsache nutzen, dass das Konsolensubsystem (mit dem Textmodusprogramme in Windows unterstützt und ausgeführt werden) den alten „DOS“-Interrupt 0x21 unterstützt – ja, sogar in cmd, nicht nur in `command. (Es funktioniert nicht in 64-Bit-Versionen von Windows, da dort viel Abwärtskompatibilität verloren gegangen ist.)

Sie können beispielsweise das folgende Debug-Skript unter speichern c.scrund es kompilieren, indem Sie es debug < c.scrvon der Befehlszeile aus ausführen. Es wird eine .comDatei erstellt, mit der Sie das aktuelle Verzeichnis ändern können.

a
mov si,82
mov dl,[si]
or dl,20
sub dl,61
mov ah,e
int 21
mov dl,[si]
cmp dl,d
jz 119
inc si
jmp 10f
xor dl,dl
mov [si],dl
mov dx,82
mov ah,3b
int 21
mov ah,4c
int 21

n c.com
rcx
28
w
q

(Beachten Sie, dass es keine langen Dateinamen unterstützt, Sie müssen also die8.3Version. Es ändert auch das aktuelle Laufwerk, sodass Sie das Verzeichnis in einem Zug auf ein anderes Laufwerk ändern können, aber es tut dies auf sehr einfache Weise und führt keine Fehlerprüfung durch, sodass der Versuch, in ein Verzeichnis zu wechseln, das mit einem Buchstaben beginnt, für den ein Laufwerk existiert, nicht funktioniert. Das heißt, es c c:\windowsfunktioniert wie c \windows, aber c asdnicht, wenn Sie ein A:Laufwerk haben, es sei denn, es enthält zufällig ein Verzeichnis mit dem Namen asd. Sie können es erweitern und Fehlerprüfungen und dergleichen hinzufügen, wenn Sie möchten, aber es beweist meinen Standpunkt bezüglich der Möglichkeit, dass es cdin Windows extern sein kann.)

Sie können auch das folgende Pascal-Programm speichern (z. B. als c.pas) und es mit Turbo Pascal oder der GO32-Version des FreePascal-Compilers kompilieren (die 32-Bit-Version funktioniert nicht, da sie die normale Windows-API verwendet):

program cd;
begin
  chdir(paramstr(1));
end.

Führen Sie es erneut einfach aus, um das aktuelle Verzeichnis zu ändern (z. B. „c.exe "c:\Programme" – ja, lange Ordnernamen funktionieren, werden aber bei der Ausführung automatisch in 8.3-Namen umgewandelt).

Antwort2

Die Idee eines cdBefehls zum Ändern des Verzeichnisses wurde 1969 als Teil von Unix erfunden. Er ist knapp gehalten, wie die meisten anderen Unix-Befehle wie ls, rm, sedusw. Er passte auch zu dem baumstrukturierten Dateisystem, das als Teil von Unix erfunden wurde, wo sogar Geräte Dateien unter waren /dev. Man vergisst leicht, dass es vor Unix nicht viele Betriebssysteme gab, die baumstrukturierte Dateisysteme mit Verzeichnissen hatten, die normale Benutzer einfach erstellen konnten. Normalerweise hatte man einfach (bestenfalls) irgendwo einen Stapel Dateien und seltsame IBM-Dienstprogramme wie IEBGENER, um sie zu bearbeiten.

Dabei cdwird das aktuelle Verzeichnis des aktuellen Prozesses geändert, in diesem Fall die Shell. Dies hat Auswirkungen darauf, wie das Betriebssystem relative Dateinamen interpretiert, also solche, die nicht vollständig aus der Wurzel /des Dateisystems stammen. Das aktuelle Verzeichnis wird vom übergeordneten an den untergeordneten Prozess vererbt.

Es gibt einige große Unterschiede in der Semantik von cdUnix- oder Linux-Systemen im Vergleich zu Windows-Systemen. Einer davon ist, was soll cdohne Operand tun? Unter Unix oder Linux bringt es Sie zum Home-Verzeichnis. Unter Windows meldet cmd.exees cdeinfach das aktuelle Verzeichnis. Außerdem ist Windows nicht einfach verwurzelt, es hat Laufwerksbuchstaben und Sie können auf jedem davon ein aktuelles Verzeichnis haben, obwohl die Implementierung hinter den Kulissen darin besteht, dass Microsoft dies über die Mauer in den Anwendungsbereich geworfen hat: Jeder Prozess trägt einige versteckte Umgebungsvariablen mit seltsamen Namen, wie =C:die, für deren aktuelle Aktualisierung die Anwendung verantwortlich ist.

Einige cdBefehle sind besser als andere, aber das ist vielleicht Geschmackssache.C-Shellführte die Idee ein, dass CDPATHes wie die PATHVariable funktioniert, aber Verzeichnisse statt ausführbarer Dateien findet. Die C-Shell führte auch Verzeichnisstapel ein, die es Ihnen ermöglichen, pushdoder popddas aktuelle Verzeichnis. Beim Schreibenmeine eigene C-ShellIch habe das alles kopiert, eine Option hinzugefügt, mit der der Benutzer entscheiden kann, was cdohne Operanden geschehen soll, und eine von einem Kunden vorgeschlagene Funktion, die besagt, dass, wenn Sie mehr als 2 Punkte eingeben, cd ....n-1 Ebenen nach oben gegangen werden soll.

Antwort3

Ja, cdist ein *nix-Befehl, der unter Linux, OSX und den anderen *nix-Betriebssystemen funktioniert.

Antwort4

Der cdBefehl in DOS und Windows ist dem für Unix/Linux sehr ähnlich, und das aus gutem Grund: Das gesamte Konzept der Verzeichnisse wurde von Unix kopiert.

Das erste System, auf dem MS-DOS (bekannt als PC-DOS) lief, war der IBM PC. Es gab keine Festplatte – der Speicher war auf Disketten, die mit 180 KB und 360 KB Speicherkapazität erhältlich waren. Bei so begrenzten Medien war kein kompliziertes Dateibenennungsschema erforderlich. Ein vollständig qualifizierter Dateiname war also nur eine Laufwerksbezeichnung, gefolgt von einem8.3 Dateinamewie a:autoexec.batoder b:advent.exe.

MS-DOS 2.0 versuchte, viele dieser Probleme zu lösen, indem es Funktionen von Unix kopierte. Dazu gehörten Verzeichnisse und die Befehle zum Umgang mit ihnen. Ein Problem war, dass MS-DOS bereits das Zeichen / verwendete, um optionale Argumente anzuzeigen. Aus diesem Grund verwenden Windows und Unix unterschiedliche Pfadtrennzeichen.

Ein wichtiger Unterschied besteht darin, dass Unix eine einheitliche Verzeichnishierarchie ohne Laufwerksbezeichnungen hat. Bei der Anpassung des cdBefehls an MS-DOS musste Microsoft eine neue Semantik für den Begriff „aktuelles Verzeichnis“ erfinden, die die Laufwerksbezeichnung berücksichtigt. Um die Abwärtskompatibilität zu maximieren (damit Namen wie a:somethingimmer noch eine sinnvolle Bedeutung haben), erfanden sie den Begriff „aktuelles Laufwerk“ und verfügten, dass jedes Laufwerk sein eigenes „aktuelles Verzeichnis“ hat. Wenn Sie also das „aktuelle Verzeichnis“ ändern, ändern Sie tatsächlich das aktuelle Verzeichnis für das aktuelle Laufwerk. Normalerweise müssen Sie sich über diese Art von Details keine Gedanken machen. Aber es erklärt, warum scheinbar nichts passiert, wenn Sie online sind c:\somedirund etwas tun . Was?cd d:\otherdirhatpassiert ist, dass Sie das aktuelle Verzeichnis für Ihr Laufwerk geändert haben, ohne Ihr aktuelles Laufwerk zu ändern; dazu d:müssen Sie einen Befehl eingeben .d:

verwandte Informationen