使用 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.
**/