Dies hat nichts mit Unix oder Linux zu tun. Es ist ganz Win32 und Cygwin.
Wie bereits vor fast einem Vierteljahrhundert im Microsoft-Dokument für Win32 und in verschiedenen Win32-Programmierhandbüchern erläutert, kennt der Windows NT-Kernel nicht mehrere Laufwerke mit jeweils eigenen Arbeitsverzeichnissen. Dieses MS-DOS- Paradigma wird in Win32 unter Verwendung von Umgebungsvariablen emuliert, die normalerweise nicht von den set
Befehlen der Win32-Befehlsinterpreter angezeigt werden (aber programmgesteuert ziemlich leicht zugänglich sind), mit Namen in der Form (wobei es sich um einen Laufwerksbuchstaben handelt). Dieser Vorwand mehrerer Arbeitsverzeichnisse ist genau wie das gute alte MS-DOS eine gemeinsame Fiktion, die von der Win32-API, dem Befehlsinterpreter von Microsoft und den Laufzeitbibliotheken für verschiedene Sprachen, einschließlich einiger C- und C ++ - Compiler, konsultiert und verwaltet wird .=D:
D
cmd
Wenn ein Cygwin-Prozess gestartet wird, konvertiert er den Win32-Umgebungsblock in ein "mehr UNIX-y" -Formular. Es verfügt über eine Reihe fest verdrahteter spezieller Konvertierungsregeln für verschiedene spezifische Variablen, z PATH
. Es ist nicht im Cygwin-Dokument enthalten, aber es behandelt auch die Umgebungszeichenfolgen, indem es die Führung in eine umwandelt . Dies ergibt Umgebungszeichenfolgen, wie sie von der Cygwin-Programmausführung gesehen werden . Diese Konvertierung wird umgekehrt, wenn aus irgendeinem Grund eine neue Win32-Umgebung generiert werden muss, z. B. um einen neuen Prozess zu erzeugen und den Rücken in einen zu verwandeln .=D:=D:\path
=
!
!D:=D:\path
!
=
Damit der Befehlsinterpreter von Microsoft diese Umgebungsvariablen anzeigt, wird einfach eine ausgeführt
einstellen ""
Daraufhin beginnt die Ausgabe so etwas wie
= C: = C: \ Benutzer \ Jim
…
Manchmal wird eine zusätzliche dieser Umgebungsvariablen :
als Laufwerksbuchstabe angezeigt. Wenn Sie denselben set
Befehl wie oben ausführen, beginnt die Ausgabe
= :: = :: \
= C: = C: \ Benutzer \ Jim
…
Nachdem dies von Cygwin "mehr UNIX-y" gemacht wurde, ist dies natürlich genau das, was !::=::\
Sie sehen.
Da dies ein Mechanismus ist, der in Win32-Anwendungen (insbesondere im Befehlsinterpreter von Microsoft) eingebettet ist und teilweise in der Win32-API selbst verwickelt ist, ist es nicht gerade trivial, deren Existenz zu verhindern.
Weiterführende Literatur
- "
CreateProcess()
". Microsoft Win32 - Programmierreferenz: Funktionen, A-G . Microsoft Press. 1993. ISBN 9781556155178. p. 213.
- Jeffrey Richter (1995). Erweitertes Windows: Das Entwicklerhandbuch zur Win32-API für Windows NT 3.5 und Windows 95 . Microsoft Press. ISBN 9781556156779. S. 26–27.
unset '!::'