Mit Cygwin habe ich Umgebungsmodule installiert, indem ich den Quellcode heruntergeladen, configure, make und make install ausgeführt habe. Jedes Mal, wenn ich einen Modulbefehl ausführe, erhalte ich:
init.c(718):WARN:165: Cannot set TCL variable '!::'
Ich habe dies darauf zurückgeführt, dass in Cygwin die folgende Umgebungsvariable festgelegt ist:
$ env | grep ::
!::=::\
Weiß jemand, was das ist, wo es eingestellt ist, warum es notwendig sein könnte oder wie man es loswird?
Ich könnte hinzufügen, dass es für Google äußerst schwierig ist, oder sogar in Markdown korrekt angezeigt zu werden.
Aus den Kommentaren:
$ unset '!::'
-bash: unset: `!::': not a valid identifier
environment-variables
cygwin
Ben Fulton
quelle
quelle
unset '!::'
Antworten:
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
Daraufhin beginnt die Ausgabe so etwas wieManchmal wird eine zusätzliche dieser Umgebungsvariablen
:
als Laufwerksbuchstabe angezeigt. Wenn Sie denselbenset
Befehl wie oben ausführen, beginnt die AusgabeNachdem 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.quelle
Um Module
!::
vom TCL-Setup auszuschließen , ändern Sie init.c wie in diesem einheitlichen Diff gezeigt und kompilieren Sie es neu.quelle