Seltsame Umgebungsvariable! :: = :: \ in Cygwin


7

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

Es ist wirklich seltsam. vorübergehend entfernen mitunset '!::'
Otheus

Wie haben Sie "Umgebungsmodule" installiert? Eine schnelle Suche auf Cygwins Website war leer.
Jeff Schaller

Es sieht für mich so aus, als ob jemand versucht hat, den Mechanismus zur Erweiterung des Verlaufs auf seltsame Weise zu verwenden. Etwas ist schief gelaufen und hat stattdessen eine unsinnige Variable gesetzt.
Jimmyij

$ unset '! ::' -bash: unset: `! :: ': keine gültige Kennung
Ben Fulton

Ich habe EM installiert, indem ich die Quelle heruntergeladen und configure - make - make install
Ben Fulton

Antworten:


4

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 setBefehlen 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:Dcmd

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 setBefehl 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.

0

Um Module !::vom TCL-Setup auszuschließen , ändern Sie init.c wie in diesem einheitlichen Diff gezeigt und kompilieren Sie es neu.

@@ -703,6 +703,11 @@

        envsize += strlen( environ[i]) + 1;

+#ifdef __CYGWIN__
+       if( *environ[i] == '!')
+           continue;
+#endif
+
        /**
         **  Locate the equal sign and terminate the string at its position.
         **/
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.