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.