Isso não tem nada a ver com Unix ou Linux. É inteiramente Win32 e Cygwin.
Como discutido pela primeira vez no Microsoft doco para Win32 e em vários guias de programadores do Win32 há quase um quarto de século, o kernel do Windows NT não possui uma noção de várias unidades, cada uma com seus próprios diretórios de trabalho individuais. Este paradigma MS-DOS é emulado no Win32 usando variáveis de ambiente, normalmente não exibidas pelos comandos set dos interpretadores de comandos do Win32 (mas bastante facilmente acessíveis programaticamente), com nomes no formato =D: (onde D é uma letra de unidade). Essa simulação de vários diretórios de trabalho, assim como o bom e velho MS-DOS, é uma ficção compartilhada consultada e mantida pela API do Win32, o interpretador de comandos cmd da Microsoft e as bibliotecas de tempo de execução para vários idiomas incluindo alguns compiladores C e C ++. p>
Quando um processo Cygwin é iniciado, ele converte o bloco de ambiente Win32 em um formulário "mais UNIX-y". Ele tem um conjunto inteiro de regras de conversão especiais com fio para várias variáveis específicas, como PATH . Ele não está no doco do Cygwin, mas também lida com as sequências do ambiente =D:=D:\path convertendo o = inicial em ! . Isso gera seqüências de caracteres de ambiente, conforme a execução do programa Cygwin as vê, na forma !D:=D:\path . Ele inverte essa conversão quando precisa gerar um novo ambiente Win32 por qualquer motivo, como gerar um novo processo, transformando o ! em = .
Para que o interpretador de comandos da Microsoft exiba essas variáveis de ambiente, basta executar
set "", em que um verá a saída começando por algo como
=C:=C:\Users\Jim …
Às vezes, uma dessas variáveis de ambiente extra surge, com : como a letra da unidade. Executar o mesmo comando set como acima produz saída começando
=::=::\ =C:=C:\Users\Jim …
Após isso ter sido feito "mais UNIX-y" pelo Cygwin, este é, naturalmente, o mesmo !::=::\ que você está vendo.
Como esses são um mecanismo incorporado em aplicativos Win32 (especialmente no interpretador de comandos da Microsoft) e que está parcialmente enroscado na própria API do Win32, não é exatamente trivial evitar a existência deles.
Leitura adicional
- "
CreateProcess()". Referência do programador do Microsoft Win32: Funções, A – G . Microsoft Press. 1993. ISBN 9781556155178. p. 213. - Jeffrey Richter (1995). Windows Avançado: O Guia do Desenvolvedor da API do Win32 para Windows NT 3.5 e Windows 95 . Microsoft Press. ISBN 9781556156779. pp. 26–27.