Biến môi trường

Biến môi trường là một giá trị có tên động có thể ảnh hưởng đến cách các quy trình đang chạy sẽ hoạt động trên máy tính. Chúng là một phần của môi trường mà một tiến trình chạy. Ví dụ: một quy trình đang chạy có thể truy vấn giá trị của biến môi trường TEMP để khám phá vị trí thích hợp để lưu trữ các tệp tạm thời hoặc biến HOME hoặc USERPROFILE để tìm cấu trúc thư mục thuộc sở hữu của người dùng đang chạy quy trình.

Chúng được giới thiệu ở dạng hiện đại vào năm 1979 với Phiên bản 7 Unix, do đó được bao gồm trong tất cả các phiên bản và phiên bản hệ điều hành Unix từ thời điểm đó trở đi, bao gồm cả Linux và macOS. Từ PC DOS 2.0 vào năm 1982, tất cả các hệ điều hành kế nhiệm của Microsoft, bao gồm cả Microsoft Windows và OS / 2 cũng đã bao gồm chúng như một tính năng, mặc dù với cú pháp, cách sử dụng và tên biến tiêu chuẩn hơi khác nhau.

== Thiết kế ==
Trong tất cả các hệ thống Unix và giống Unix, mỗi tiến trình có một tập hợp các biến môi trường riêng biệt. Theo mặc định, khi một tiến trình được tạo, nó sẽ kế thừa một môi trường trùng lặp của tiến trình mẹ của nó, ngoại trừ những thay đổi rõ ràng do cha thực hiện khi tạo con. Ở cấp độ API, những thay đổi này phải được thực hiện giữa chạy codice_1 và thi codice_2. Ngoài ra, từ các trình bao lệnh chẳng hạn như bash, người dùng có thể thay đổi các biến môi trường cho một lệnh gọi cụ thể bằng cách gián tiếp gọi nó qua codice_3 hoặc sử dụng ký hiệu codice_4. Một chương trình đang chạy có thể truy cập các giá trị của các biến môi trường cho mục đích cấu hình.

Các tập lệnh shell và các tập tin hàng loạt sử dụng các biến môi trường để truyền dữ liệu và tùy chọn cho các quy trình con. Chúng cũng có thể được sử dụng để lưu trữ các giá trị tạm thời để tham khảo sau này trong tập lệnh shell. Tuy nhiên, trong Unix, các biến không xuất được ưu tiên cho việc này vì chúng không bị rò rỉ ra bên ngoài quy trình.

Trong Unix, một biến môi trường được thay đổi trong tập lệnh hoặc chương trình đã biên dịch sẽ chỉ ảnh hưởng đến quá trình đó và có thể là các quá trình con. Quy trình mẹ và mọi quy trình không liên quan sẽ không bị ảnh hưởng. Tương tự, việc thay đổi hoặc loại bỏ giá trị của một biến bên trong tệp loạt DOS sẽ thay đổi biến trong thời gian của codice_5. Sự tồn tại của codice_6.

Trong Unix, các biến môi trường thường được khởi tạo trong quá trình khởi động hệ thống bởi các tập lệnh hệ thống init và do đó được kế thừa bởi tất cả các quy trình khác trong hệ thống. Người dùng có thể và thường làm, tăng cường chúng trong tập lệnh hồ sơ cho trình bao lệnh mà họ đang sử dụng. Trong Microsoft Windows, giá trị mặc định của mỗi biến môi trường được lưu trữ trong sổ đăng ký Windows hoặc đặt trong codice_7. Tệp codice_8.

Trên Unix, một chương trình setuid được cung cấp cho một môi trường do người gọi của nó chọn, nhưng nó chạy với quyền hạn khác với người gọi của nó. Trình liên kết động thường sẽ tải mã từ các vị trí được chỉ định bởi các biến môi trường codice_9 và codice_10 và chạy nó với quyền hạn của quy trình. Nếu một chương trình setuid làm điều này, nó sẽ không an toàn, vì người gọi của nó có thể khiến nó chạy mã tùy ý và do đó sử dụng sai quyền hạn của nó. Vì lý do này, libc bỏ đặt các biến môi trường này khi khởi động trong một quy trình setuid. các chương trình setuid thường bỏ đặt các biến môi trường không xác định và kiểm tra các biến khác hoặc đặt chúng thành các giá trị hợp lý.

== Cú pháp ==
Các biến có thể được sử dụng cả trong tập lệnh và trên dòng lệnh. Chúng thường được tham chiếu bằng cách đặt các ký hiệu đặc biệt trước hoặc xung quanh tên biến. Ví dụ, để hiển thị thư mục chính của người dùng, trong hầu hết các môi trường tập lệnh, người dùng phải nhập: 
echo $HOME
ECHO %HOME%
Write-Output $env:HOMEPATH

=== Chuyển nhượng ===
Các lệnh codice_3 và codice_15 cũng được sử dụng để thiết lập các biến môi trường và thường được kết hợp trực tiếp vào shell.

==== Unix ====
Trong Unix, các lệnh sau cũng có thể được sử dụng, nhưng thường phụ thuộc vào một trình bao nhất định. 

Một số nguyên tắc đơn giản chi phối cách các biến môi trường đạt được hiệu quả của chúng.

Các biến môi trường là cục bộ của quá trình mà chúng được thiết lập. Nếu hai quá trình shell được tạo ra và giá trị của một biến môi trường bị thay đổi trong một, thì thay đổi đó sẽ không được nhìn thấy bởi biến kia.

Trong các hệ thống giống Unix và Unix, tên của các biến môi trường có phân biệt chữ hoa chữ thường.

Trong Unix shell, các biến có thể được gán mà không có từ khóa codice_20. Các biến được định nghĩa theo cách này được hiển thị bởi lệnh codice_15, nhưng không phải là các biến môi trường thực sự, vì chúng chỉ được lưu trữ bởi shell và không được biết đến với tất cả các tiến trình khác. codice_16 sẽ không hiển thị chúng và các tiến trình con không kế thừa chúng. 
Cú pháp tiền tố xuất biến môi trường "true" sang một quy trình con mà không ảnh hưởng đến quy trình hiện tại: 
Sự tồn tại của một biến môi trường có thể là toàn phiên hoặc toàn hệ thống.

unset là một lệnh nội trang được thực hiện bởi cả họ Bourne shell (sh, ksh, bash...) và họ C shell (csh, tcsh...) của trình bao dòng lệnh Unix. Nó bỏ đặt một biến shell, xóa nó khỏi bộ nhớ và môi trường xuất của shell. Nó được thực hiện như một nội trang của shell, vì nó trực tiếp thao tác bên trong của shell. Không thể bỏ đặt các biến shell chỉ đọc. Nếu cố gắng hủy đặt một biến chỉ đọc, lệnh hủy đặt sẽ in thông báo lỗi và trả về mã thoát khác 0.

==== DOS, OS / 2 và Windows ====
Trong DOS, OS / 2 và các trình thông dịch dòng lệnh của Windows như codice_11 codice_6 và codice_13, lệnh codice_26 được sử dụng để gán các giá trị và biến môi trường bằng các đối số sau: 
Lệnh codice_26 không có bất kỳ đối số nào hiển thị tất cả các biến môi trường cùng với các giá trị của chúng.

== Ví dụ ==
Ví dụ về các biến môi trường bao gồm:

- codice_28: danh sách các đường dẫn thư mục. Khi người dùng nhập lệnh mà không cung cấp đường dẫn đầy đủ, danh sách này sẽ được kiểm tra để xem liệu nó có chứa đường dẫn đến lệnh hay không.
- codice_29 (giống Unix) và codice_30 (Microsoft Windows): cho biết vị trí đặt thư mục chính của người dùng trong hệ thống tệp.
- codice_31 codice_32 (Giống Unix) và codice_33 (Microsoft Windows): để lưu trữ cài đặt ứng dụng. Nhiều ứng dụng sử dụng sai codice_30 cho cài đặt ứng dụng trong Windows: codice_30 chỉ nên được sử dụng trong các hộp thoại cho phép người dùng chọn giữa các đường dẫn như codice_36; cho mục đích lập trình, nên sử dụng codice_37 (cho cài đặt ứng dụng chuyển vùng được chia sẻ trên nhiều thiết bị), codice_38 (cho cài đặt ứng dụng cục bộ) hoặc codice_39 (cho cài đặt ứng dụng được chia sẻ giữa nhiều người dùng hệ điều hành).
- codice_40 (Giống Unix): chỉ định loại thiết bị đầu cuối máy tính hoặc trình mô phỏng thiết bị đầu cuối đang được sử dụng (ví dụ: codice_41 hoặc codice_42).
- codice_43 (giống Unix): chỉ định cách hiển thị lời nhắc trong Bourne shell và các biến thể.
- codice_44 (giống Unix): được sử dụng để chỉ ra nơi tìm thấy thư của người dùng.
- codice_45: vị trí nơi các tiến trình có thể lưu trữ các tệp tạm thời.

== Các biến môi trường đích thực ==
=== Unix ===
Chứa danh sách thư mục được phân tách bằng dấu hai chấm mà shell tìm kiếm các lệnh không chứa dấu gạch chéo trong tên của chúng (các lệnh có dấu gạch chéo được hiểu là tên tệp để thực thi và shell cố gắng thực thi các tệp trực tiếp). Nó tương đương với biến DOS, OS / 2 và Windows% PATH%

- codice_46

- codice_50

- codice_51

- codice_9

- codice_54 hoặc codice_55

- codice_57 codice_58 codice_58

- codice_67

=== DOS ===
Trong DOS, "môi trường chính" được cung cấp bởi bộ xử lý lệnh chính, "môi trường" này kế thừa "môi trường trước" được định nghĩa trong codice_69 codice_70 khi được tải lần đầu. Kích thước của nó có thể được cấu hình thông qua tham số codice_71 trong khoảng từ 160 đến 32767 byte. "Các" phân đoạn "môi trường cục" bộ được kế thừa cho các quy trình con thường được giảm xuống kích thước của nội dung mà chúng giữ. Một số bộ xử lý dòng lệnh (như 4DOS) cho phép xác định một lượng không gian môi trường trống tối thiểu sẽ có sẵn khi khởi chạy trình bao thứ cấp. Trong khi nội dung của các biến môi trường không thay đổi khi lưu trữ, tên của chúng (không có " codice_72 ") luôn được chuyển đổi thành chữ hoa, ngoại trừ các biến "tiền môi trường" được xác định thông qua codice_69 Chỉ thị codice_70 codice_26 trong DR DOS 6.0 trở lên (và chỉ với codice_76 (đối với "cho phép tên chữ thường") trong DR-DOS 7.02 trở lên). Về nguyên tắc, MS-DOS 7.0 trở lên cũng hỗ trợ tên biến viết thường (codice_77), nhưng không cung cấp phương tiện để người dùng xác định chúng. Tên biến môi trường chứa các chữ cái thường được lưu trữ trong môi trường giống như các biến môi trường bình thường, nhưng vẫn ẩn đối với hầu hết các phần mềm DOS, vì chúng chỉ được viết để mong đợi các biến chữ hoa. Một số bộ xử lý lệnh giới hạn độ dài tối đa của tên biến là 80 ký tự. Trong khi về cơ bản chỉ bị giới hạn bởi kích thước của "phân đoạn môi trường", một số chương trình DOS và Windows 16 bit không mong đợi nội dung của các biến môi trường vượt quá 128 ký tự. codice_11 DR-DOS codice_11 codice_6 hỗ trợ các biến môi trường lên đến 255, 4DOS thậm chí lên đến 512 ký tự. Kể từ khi codice_11 codice_6 có thể được định cấu hình (qua codice_83) để hỗ trợ các dòng lệnh lên đến 1024 ký tự bên trong MS-DOS 7.0 trở lên, các biến môi trường cũng phải chứa ít nhất 1024 ký tự. Trong một số phiên bản DR-DOS, môi trường được chuyển cho trình điều khiển, thường không cần môi trường của chúng sau khi cài đặt, có thể bị thu hẹp hoặc chuyển vị trí thông qua codice_84 hoặc codice_85 / codice_86 codice_87 (môi trường không), codice_88 (ổ thay thế, ví dụ: codice_89 codice_6) và codice_91 (định vị lại môi trường ở trên chương trình) để giảm thiểu hiệu quả bộ nhớ thường trú của trình điều khiển.

Trong chế độ hàng loạt, các biến môi trường không tồn tại được thay thế bằng một chuỗi có độ dài bằng không.

- codice_92 (được hỗ trợ kể từ DOS 3.3)

- codice_96 (được hỗ trợ từ MS-DOS 6.0 và PC DOS 6.1, cũng được hỗ trợ bởi ROM-DOS)

- codice_111 (được giới thiệu với 4DOS, cũng được hỗ trợ kể từ MS-DOS 7.0)

- codice_119 (được hỗ trợ kể từ DOS 2.0)

- codice_127 (được hỗ trợ từ MS-DOS 6.2 và PC DOS 6.3, cũng được hỗ trợ bởi ROM-DOS)

- codice_135 (được hỗ trợ từ MS-DOS 7.0)

- codice_136 (được hỗ trợ từ MS-DOS 7.0)

- codice_137 (được hỗ trợ từ PC DOS 6.3 và DR-DOS 7.07)

- codice_141 (được hỗ trợ kể từ DOS 2.0)

- codice_149 (được hỗ trợ kể từ DOS 2.0)

- codice_152 (và codice_153)

Họ DR-DOS hỗ trợ một số "biến môi trường tiêu chuẩn" bổ sung bao gồm:

- codice_158

- codice_161 / codice_162 / codice_163

- codice_204

- codice_211

- codice_215

- codice_219

- codice_220

- codice_221

- codice_226

- codice_244

- codice_249

- codice_77

"Các biến quản lý người dùng" lưu trữ thông tin liên quan đến tài nguyên và cài đặt thuộc sở hữu của các hồ sơ người dùng khác nhau trong hệ thống. Theo nguyên tắc chung, các biến này không đề cập đến các tài nguyên hệ thống hoặc vị trí quan trọng cần thiết để HĐH chạy.

- codice_260 (codice_261 kể từ Windows Vista)

- codice_262

- codice_264

"Biến hệ thống tùy chọn"   không được chỉ định rõ ràng theo mặc định nhưng có thể được sử dụng để sửa đổi hành vi mặc định của một số lệnh bảng điều khiển tích hợp sẵn. Các biến này cũng không cần phải được chỉ định rõ ràng làm đối số dòng lệnh.

==== Giá trị mặc định ====
Các bảng sau đây cho thấy các giá trị mặc định điển hình của các biến môi trường nhất định trong các phiên bản tiếng Anh của Windows vì chúng có thể được truy xuất trong codice_267.

(Một số biến này cũng được xác định khi chạy codice_11 codice_6 trong Windows, nhưng khác ở một số chi tiết quan trọng nhất định: Dưới codice_11 codice_6, tên của biến môi trường luôn được viết hoa. Một số, nhưng không phải tất cả các biến đều chứa 8.3 ngắn chứ không phải tên tệp dài. Trong khi một số biến có trong môi trường codice_267 bị thiếu, thì cũng có một số biến đặc trưng cho môi trường codice_5.) 

Trong danh sách này, không có biến môi trường nào tham chiếu đến vị trí của thư mục "My Documents" của người dùng, vì vậy không có phương pháp chuẩn nào để đặt thư mục chính của chương trình thành thư mục "My Documents".

== Biến môi trường giả ==
- codice_274

- codice_286

- codice_290

- codice_295 và codice_296

- codice_301

- codice_310

"Các biến thông tin hệ thống" được hỗ trợ bởi DR-DOS codice_11 codice_6 với mạng được tải:

- codice_325

- codice_338

"Biến môi trường động" (còn được đặt tên là "biến nội bộ" hoặc "biến" "thông tin hệ thống" trong DOS) là biến môi trường giả được codice_267 hỗ trợ khi phần mở rộng dòng lệnh được bật và chúng mở rộng thành các giá trị rời rạc khác nhau bất cứ khi nào được truy vấn, nghĩa là giá trị của chúng có thể thay đổi khi được truy vấn nhiều lần ngay cả trong cùng một lệnh. Mặc dù chúng có thể được sử dụng trong các công việc hàng loạt và khi được nhắc, chúng không được lưu trữ trong môi trường. Do đó, chúng không được codice_26 liệt kê cũng như không tồn tại để các chương trình bên ngoài đọc. Chúng không phân biệt chữ hoa chữ thường.

Một cách gián tiếp, chúng cũng được hỗ trợ theo codice_11 của Windows codice_11 codice_6, đã được sửa đổi để gọi nội bộ codice_345 codice_198 để thực hiện các lệnh.

- codice_347

- codice_357

- codice_369

- codice_374

- codice_375

- codice_378

== Xem thêm ==
- Biến (khoa học máy tính)
- Danh sách các lệnh Unix
- Danh sách các lệnh DOS
- Thư mục đặc biệt
- Môi trường mô-đun
- Vỏ PWB

== Liên kết ngoài ==
- environ(7)
- environ(7)
- environ(7)
- environ(5)
- Wiki Biến Môi trường
- Biến môi trường người dùng
- sửa lỗi setx.exe không tìm thấy