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.
**/