Cygwin 中的奇怪环境变量 !::=::\

Ben*_*ton 8 cygwin environment-variables

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

init.c(718):WARN:165: Cannot set TCL variable '!::'
Run Code Online (Sandbox Code Playgroud)

我已经将其追溯到 Cygwin 具有以下环境变量集的事实:

$ env | grep ::
!::=::\
Run Code Online (Sandbox Code Playgroud)

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

我可能会补充说,这对 Google 来说极其困难,甚至无法在 Markdown 中正确显示。


来自评论:

$ unset '!::' 
-bash: unset: `!::': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

Jde*_*eBP 6

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

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

当 Cygwin 进程启动时,它会将 Win32 环境块转换为“更多 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 页。