这与 Unix 或 Linux 无关。它完全是 Win32 和 Cygwin。

这与 Unix 或 Linux 无关。它完全是 Win32 和 Cygwin。

使用 Cygwin,我通过下载源代码、运行 configure、make 和 make install 来安装环境模块。每次运行模块命令时,我都会得到:

init.c(718):WARN:165: Cannot set TCL variable '!::'

我已将其追溯到 Cygwin 设置了以下环境变量:

$ env | grep ::
!::=::\

有谁知道这是什么,它设置在哪里,为什么它可能是必要的,或者如何摆脱它?

我可能会补充一点,Google 很难,甚至很难在 Markdown 中正确显示。


来自评论:

$ unset '!::' 
-bash: unset: `!::': not a valid identifier

答案1

这与 Unix 或 Linux 无关。它完全是 Win32 和 Cygwin。

正如大约四分之一世纪前 Microsoft doco for Win32 和各种 Win32 程序员指南中首次讨论的那样,Windows NT 内核没有多个驱动器的概念,每个驱动器都有自己的单独工作目录。这操作系统范式在 Win32 中使用环境变量进行模拟,通常不会由 Win32 命令解释器的set命令显示(但通过编程方式相当容易访问),其名称采用以下形式(其中=D:D是驱动器号)。这种假装的多个工作目录,就像老式的 MS-DOS 一样,是由 Win32 API、Microsoft 的命令解释器cmd以及各种语言(包括一些 C 和 C++ 编译器)的运行时库咨询和维护的共享虚构。

当 Cygwin 进程启动时,它将 Win32 环境块转换为“more UNIX-y”形式。它有一整套针对各种特定变量的硬连线特殊转换规则,例如PATH.它不在 Cygwin doco 中,但它也同样通过将前导转换为.这会产生环境字符串,正如 Cygwin 程序执行所看到的那样,其形式为.当它出于某种原因需要生成新的 Win32 环境时(例如生成新进程、将背面转换为.=D:=D:\path=!!D:=D:\path!=

要让 Microsoft 的命令解释器显示这些环境变量,只需运行

放 ””
于是人们会看到输出开始类似

=C:=C:\用户\吉姆
……

有时,这些环境变量中会出现额外的一个,作为:驱动器号。运行set与上面相同的命令会产生输出开始

=::=::\
=C:=C:\用户\吉姆
……

在 Cygwin 将其变得“更加 UNIX-y”之后,这当然就是!::=::\您所看到的。

因为这些机制嵌入在 Win32 应用程序中(尤其是在 Microsoft 的命令解释器中),并且部分地与 Win32 API 本身纠缠在一起,所以阻止它们的存在并非易事。

进一步阅读

  • CreateProcess()“。Microsoft Win32 程序员参考:函数,A–G。微软出版社。 1993.ISBN 9781556155178。p。 213.
  • 杰弗里·里希特 (1995)。 高级 Windows:Windows NT 3.5 和 Windows 95 的 Win32 API 开发人员指南。微软出版社。 ISBN 9781556156779。第 26–27 页。

答案2

要使模块!::从其 TCL 设置中排除,请按照此统一差异中所示修改 init.c,然后重新编译。

@@ -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.
         **/

相关内容