Biến môi trường kỳ lạ! :: = :: \ trong Cygwin


7

Sử dụng Cygwin, tôi đã cài đặt Mô-đun Môi trường bằng cách tải xuống mã nguồn, chạy cấu hình, tạo và thực hiện cài đặt. Mỗi lần tôi chạy lệnh mô-đun, tôi nhận được:

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

Tôi đã bắt nguồn từ việc Cygwin có bộ biến môi trường sau:

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

Có ai biết đây là cái gì, nó được đặt ở đâu, tại sao nó có thể cần thiết hoặc làm thế nào để thoát khỏi nó?

Tôi có thể thêm rằng Google cực kỳ khó khăn hoặc thậm chí có thể hiển thị chính xác trong Markdown.


Từ các ý kiến:

$ unset '!::' 
-bash: unset: `!::': not a valid identifier

Nó thực sự kỳ lạ cho chắc chắn. tạm thời xóa nó bằngunset '!::'
Otheus

Làm thế nào bạn cài đặt "Mô-đun môi trường"? Một tìm kiếm nhanh trên trang web của Cygwin đã bị bỏ trống.
Jeff Schaller

Theo tôi, có vẻ như ai đó đã cố gắng sử dụng cơ chế mở rộng lịch sử theo một cách kỳ lạ nào đó, đã xảy ra sự cố và thay vào đó đặt một biến vô nghĩa.
jimmij

$ unset '! ::' -bash: unset: `! :: ': không phải là định danh hợp lệ
Ben Fulton

Tôi đã cài đặt EM bằng cách tải xuống nguồn và chạy configure - make - make install
Ben Fulton

Câu trả lời:


4

Điều này không có gì để làm với Unix hoặc Linux. Nó hoàn toàn là Win32 và Cygwin.

Như đã thảo luận lần đầu trong tài liệu Microsoft cho Win32 và các lập trình viên Win32 khác nhau hướng dẫn gần một phần tư thế kỷ trước, nhân Windows NT không có khái niệm nhiều ổ đĩa với mỗi thư mục làm việc riêng. Đây MS-DOS mô hình được mô phỏng trong Win32 sử dụng các biến môi trường, thường không hiển thị bởi Win32 lệnh thông dịch viên setlệnh (nhưng lập trình khá dễ dàng truy cập), với những cái tên theo hình thức (trong đó là một ký tự ổ đĩa). Giả vờ của nhiều thư mục làm việc, giống như MS-DOS cũ, là một tiểu thuyết được chia sẻ được tư vấn và duy trì bởi API Win32, trình thông dịch lệnh của Microsoft và các thư viện thời gian chạy cho các ngôn ngữ khác nhau bao gồm một số trình biên dịch C và C ++.=D:Dcmd

Khi một quá trình Cygwin khởi động, nó sẽ chuyển đổi khối môi trường Win32 thành dạng "nhiều UNIX-y" hơn. Nó có một tập hợp các quy tắc chuyển đổi đặc biệt khó khăn cho các biến cụ thể khác nhau, chẳng hạn như PATH. Nó không có trong tài liệu Cygwin, nhưng nó cũng xử lý các chuỗi môi trường bằng cách chuyển đổi hàng đầu thành một . Điều này mang lại các chuỗi môi trường, khi thực thi chương trình Cygwin nhìn thấy chúng, có dạng . Nó đảo ngược chuyển đổi này khi cần tạo môi trường Win32 mới vì bất kỳ lý do gì, chẳng hạn như sinh ra một quy trình mới, biến mặt sau thành a .=D:=D:\path=!!D:=D:\path!=

Để có được trình thông dịch lệnh của Microsoft để hiển thị các biến môi trường này, người ta chỉ cần chạy

bộ ""
trong đó người ta sẽ thấy đầu ra bắt đầu như

= C: = C: \ Người dùng \ Jim
Giáo dục

Đôi khi, thêm một trong các biến môi trường này mọc lên, với :tên là ký tự ổ đĩa. Chạy setlệnh tương tự như trên mang lại đầu ra đầu ra

= = = = :: \
= C: = C: \ Người dùng \ Jim
Giáo dục

Sau khi điều này được Cygwin tạo ra "nhiều UNIX-y" hơn, đây tất nhiên là thứ !::=::\mà bạn đang thấy.

Vì đây là một cơ chế được nhúng trong các ứng dụng Win32 (đặc biệt là trong trình thông dịch lệnh của Microsoft) và một phần bị vướng vào API Win32, nên việc ngăn chặn sự tồn tại của chúng không phải là chuyện nhỏ.

đọc thêm

  • " CreateProcess()". Tham khảo Microsoft Win32 Programmer của: Chức năng, A-G . Báo chí Microsoft. 1993. ISBN Muff556155178. P. 213.
  • Jeffrey Richter (1995). Windows nâng cao: Hướng dẫn của nhà phát triển về API Win32 cho Windows NT 3.5 và Windows 95 . Báo chí Microsoft. ISBN Muff556156779. Trang 26 2127.

0

Để làm cho các Mô-đun loại trừ !::khỏi thiết lập TCL của nó, hãy sửa đổi init.c như thể hiện trong khác biệt thống nhất này và biên dịch lại.

@@ -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.
         **/
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.