Cygwinを使用してソースコードをダウンロードし、設定、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です。
約25年前に、Win32用Microsoft docoとさまざまなWin32プログラマガイドで最初に議論したように、Windows NTカーネルにはそれぞれ別々の作業ディレクトリを持つ複数のドライブの概念はありません。これオペレーティングシステムパラダイムは環境変数を使用してWin32でエミュレートされ、通常set
Win32コマンドソルバーのコマンドによって公開されません(ただし、プログラムでアクセスするのは非常に簡単です)。=D:
D
ドライブ文字です)。古いMS-DOSなど、この仮想マルチ作業ディレクトリは、仮想cmd
Win32 API、Microsoftのコマンドソルバー、およびさまざまな言語(一部のCおよびC ++コンパイラを含む)のランタイムライブラリで参照および維持する共有です。
Cygwinプロセスが起動すると、Win32環境ブロックを「追加のUNIX-y」形式に変換します。これには、さまざまな特定の変数に対するハードワイヤードされた特殊な変換規則があります。たとえば、PATH
Cygwin docoにはありませんが、先行を 。何らかの理由で新しいWin32環境を作成する必要がある場合(たとえば、新しいプロセスの作成)、背面を 。=D:=D:\path
=
!
!D:=D:\path
!
=
Microsoft のコマンド ソルバーにこれらの環境変数を表示させるには、次の手順を実行します。
置く」これにより、出力が次のように見え始めるのがわかります。
=C:=C:\ユーザー\荷物 …
:
場合によっては、これらの環境変数にドライブ文字として追加の変数が表示されることがあります。set
上記と同じコマンドを実行すると、次のような出力が生成されます。
=::=::\ =C:=C:\ユーザー\荷物 …
これはもちろん、Cygwinが「より多くのUNIXレベル」にした後に見ることが!::=::\
できるものです。
これらのメカニズムはWin32アプリケーション(特にMicrosoftのコマンドソルバー)に含まれており、Win32 API自体と部分的に絡み合っているため、これらのメカニズムの存在を防ぐのは簡単ではありません。
追加読書
- 「
CreateProcess()
。」Microsoft Win32プログラマリファレンス:関数、A–G。マイクロソフトプレス。 1993. ISBN 9781556155178。 213. - リヒター、ジェフリー(1995)。 高度なWindows:Windows NT 3.5およびWindows 95用Win32 API開発者ガイド。マイクロソフトプレス。 ISBN 9781556156779。26〜27ページ。
答え2
!::
TCL設定からモジュールを除外するには、このUnity diffに示すように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.
**/