Variável de ambiente estranha! :: = :: \ in Cygwin

7

Usando o Cygwin, eu instalei o Environment Modules fazendo o download do código fonte, executando configure, make e make install. Toda vez que eu executo um comando do módulo, recebo:

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

Eu rastreei isso até o fato de que o Cygwin tem o seguinte conjunto de variáveis de ambiente:

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

Alguém sabe o que é isso, onde está definido, por que pode ser necessário ou como se livrar dele?

Posso acrescentar que é extremamente difícil para o Google ou até mesmo exibir corretamente no Markdown.

Dos comentários:

$ unset '!::' 
-bash: unset: '!::': not a valid identifier
    
por Ben Fulton 23.12.2015 / 16:40

2 respostas

3

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.
por 23.12.2015 / 21:08
0

Para fazer os Módulos excluírem !:: de sua configuração do TCL, modifique o init.c conforme mostrado neste diff unificado e recompile.

@@ -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.
         **/
    
por 08.04.2016 / 00:36