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 `fork` và thi `exec`. 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 `env` hoặc sử dụng ký hiệu `ENVIRONMENT_VARIABLE=VALUE &#x3C; command &#x3E;`. 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 `[[COMMAND.COM|COMMAND]]`. Sự tồn tại của `[[COMMAND.COM|COM]]`.

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 `AUTOEXEC`. Tệp `BAT`.

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 `$LD_LIBRARY_PATH` và `$LD_PRELOAD` 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: 
```bash
echo $HOME
```
 Trong DOS, OS / 2 và các trình thông dịch dòng lệnh của Windows như `COMMAND.` `COM` và `cmd.exe`, người dùng phải nhập: 
```dos
ECHO %HOME%
```
 Trong Windows PowerShell, người dùng phải nhập: 
```powershell
Write-Output $env:HOMEPATH
```
 Các lệnh **<code>env</code>**, **<code>set</code>** và **<code>printenv</code>** hiển thị tất cả các biến môi trường và giá trị của chúng. `printenv` cũng có thể được sử dụng để in một biến duy nhất bằng cách đặt tên biến đó làm đối số duy nhất cho lệnh.

### Chuyển nhượng
Các lệnh `env` và `set` 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. 
  *VARIABLE* = *giá trị* #
 xuất *VARIABLE* # cho Bourne và các vỏ liên quan

  xuất *VARIABLE* = *value* # cho ksh, bash và các trình bao liên quan

  setenv *VARIABLE* *value* # cho csh và các trình bao liên quan 
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 **<code>export</code>**. Các biến được định nghĩa theo cách này được hiển thị bởi lệnh **<code>set</code>**, 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. `printenv` sẽ không hiển thị chúng và các tiến trình con không kế thừa chúng. 
  *VARIABLE* = *giá trị* 
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:  
  *VARIABLE* = *value* program_name [đối số] 
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ư `COMMAND.` `COM` và `cmd.exe`, lệnh **<code>SET</code>** được sử dụng để gán các giá trị và biến môi trường bằng các đối số sau: 
  SET *VARIABLE* = *giá trị* 
Lệnh **<code>SET</code>** 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:

* `PATH`: 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. 
* `HOME` (giống Unix) và `USERPROFILE` (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. 
* `HOME/{.`  `AppName}`  (Giống Unix) và `APPDATA\{DeveloperName\AppName}` (Microsoft Windows): để lưu trữ cài đặt ứng dụng. Nhiều ứng dụng sử dụng sai `USERPROFILE` cho cài đặt ứng dụng trong Windows: `USERPROFILE` 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ư `Documents/Pictures/Downloads/Music`; cho mục đích lập trình, nên sử dụng `APPDATA` (cho cài đặt ứng dụng chuyển vùng được chia sẻ trên nhiều thiết bị), `LOCALAPPDATA` (cho cài đặt ứng dụng cục bộ) hoặc `PROGRAMDATA` (cho cài đặt ứng dụng được chia sẻ giữa nhiều người dùng hệ điều hành).  
* `TERM` (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ụ: `vt100` hoặc `[[Thiết bị đầu cuối máy tính|dumb]]`). 
* `PS1` (giống Unix): chỉ định cách hiển thị lời nhắc trong Bourne shell và các biến thể. 
* `MAIL` (giống Unix): được sử dụng để chỉ ra nơi tìm thấy thư của người dùng. 
* `TEMP`: 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%

; `$HOME` 
: Có vị trí của người dùng thư mục home. Mặc dù thư mục home của người dùng hiện tại cũng có thể tìm hiểu thông qua C-chức năng `getpwuid` và `getuid`, `$HOME` thường được sử dụng để thuận tiện trong kịch bản shell khác nhau (và bối cảnh khác). Sử dụng biến môi trường cũng cung cấp cho người dùng khả năng trỏ đến một thư mục khác.

; `$PWD` 
: Biến này trỏ đến thư mục hiện tại. Tương đương với đầu ra của lệnh pwd khi được gọi mà không có đối số.

; `$DISPLAY` 
: Chứa số nhận dạng cho màn hình mà các chương trình X11 sẽ sử dụng theo mặc định.

; `$LD_LIBRARY_PATH` 
: Trên nhiều hệ thống với một Unix mối liên kết động, chứa một danh sách thư đại tràng-tách các thư mục mà mối liên kết động nên tìm kiếm đối tượng chia sẻ khi xây dựng một hình ảnh quá trình sau khi `exec`, trước khi tìm kiếm trong bất kỳ thư mục khác.

; `$LIBPATH` hoặc `$SHLIB_PATH` 
: Các lựa chọn thay thế cho `$LD_LIBRARY_PATH` thường được sử dụng trên các phiên bản Unix cũ hơn.

; `$LANG, $LC_ALL, $LC_.`  `.`  `.` 
: `$LANG` được sử dụng để đặt thành ngôn ngữ mặc định. Ví dụ: nếu các giá trị ngôn ngữ là `pt_BR`, thì ngôn ngữ được đặt thành (Braxin) tiếng Bồ Đào Nha và thông lệ Braxin được sử dụng nếu có liên quan. Các khía cạnh khác nhau của bản địa hóa được kiểm soát bởi từng biến số `$LC_` (`$LC_CTYPE`, `$LC_ COLLATE`, `$LC_DATE` v.v.). `$LC_ALL` có thể được sử dụng để buộc cùng một ngôn ngữ cho tất cả các khía cạnh.

; `$TZ` 
: Đề cập đến múi giờ. Nó có thể ở một số định dạng, hoặc chỉ định múi giờ hoặc tham chiếu đến một tệp (trong `/usr/share/zoneinfo`).

### 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 `CONFIG.` `SYS` 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ố `COMMAND /E:n` 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ó " `%` ") 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 `[[CONFIG.SYS|CONFIG.]]` Chỉ thị `[[CONFIG.SYS|SYS]]` `[[CONFIG.SYS|SET]]` trong DR DOS 6.0 trở lên   (và chỉ với `[[CONFIG.SYS|SWITCHES=/L]]` (đố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 (`%windir%`), 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ự. `COMMAND.` DR-DOS `COMMAND.` `COM` 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 `COMMAND.` `COM` có thể được định cấu hình (qua `/L:128..1024`) để 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 `SETENV` hoặc `[[CONFIG.SYS|INSTALL[HIGH]]]` / `LOADHIGH` `/Z` (môi trường không), `/D[: loaddrive ]` (ổ thay thế, ví dụ: `B:TSR.`  `COM`) và `/E` (đị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.

; `%APPEND%` (được hỗ trợ kể từ DOS 3.3) 
: Biến này chứa một danh sách các thư mục được phân tách bằng dấu chấm phẩy để tìm kiếm tệp. Nó thường được thay đổi thông qua lệnh `APPEND /E`, lệnh này cũng đảm bảo rằng tên thư mục được chuyển đổi thành chữ hoa. Một số phần mềm DOS thực sự mong đợi tên được lưu trữ bằng chữ hoa và độ dài của danh sách không vượt quá 121  ký tự, do đó tốt nhất không nên sửa đổi biến thông qua lệnh `SET`. Tên tệp dài có chứa khoảng trắng hoặc các ký tự đặc biệt khác không được đặt trong dấu ngoặc kép (`"`).

; `%CONFIG%` (được hỗ trợ từ MS-DOS 6.0 và PC DOS 6.1, cũng được hỗ trợ bởi ROM-DOS) 
: Biến này giữ tên tượng trưng của cấu hình khởi động hiện được chọn. Nó được thiết lập bởi DOS BIOS (`IO.` `SYS`, `IBMBIO.` `COM`, v.v.) đến tên được xác định bởi `[[CONFIG.SYS|CONFIG.]]` tương ứng `[[CONFIG.SYS|CONFIG.]]` `[[CONFIG.SYS|SYS]]` chỉ thị `[[CONFIG.SYS|MENUITEM]]` trước khi khởi chạy bộ xử lý lệnh chính. Mục đích chính của nó là cho phép các trường hợp đặc biệt hơn nữa trong `AUTOEXEC.` `BAT` và các lô tương tự tùy thuộc vào tùy chọn đã chọn tại thời điểm khởi động. Điều này có thể được mô phỏng trong DR-DOS bằng cách sử dụng `CONFIG.` Chỉ thị `SYS` `[[CONFIG.SYS|SET]]` giống như `SET CONFIG=1`.

; `%CMDLINE%` (được giới thiệu với 4DOS, cũng được hỗ trợ kể từ MS-DOS 7.0) 
: Biến này chứa văn bản được mở rộng đầy đủ của dòng lệnh hiện đang thực thi. Nó có thể được các ứng dụng đọc để phát hiện việc sử dụng và truy xuất các dòng lệnh dài, vì phương pháp truyền thống để truy xuất các đối số dòng lệnh thông qua PSP (hoặc các hàm API liên quan) bị giới hạn ở 126 ký tự và không còn khả dụng khi FCB được mở rộng hoặc DTA mặc định được sử dụng. Trong khi 4DOS hỗ trợ các dòng lệnh dài hơn, `COMMAND.` `COM` vẫn chỉ hỗ trợ tối đa 126 ký tự tại dấu nhắc theo mặc định (trừ khi được ghi đè bằng `/U:128..255` để chỉ định kích thước của bộ đệm dòng lệnh), nhưng tuy nhiên, các dòng lệnh nội bộ có thể dài hơn thông qua mở rộng biến fe (tùy thuộc trên `/L:128..1024` để chỉ định kích thước của bộ đệm bên trong). Ngoài byte độ dài dòng lệnh trong PSP, dòng lệnh PSP thường bị giới hạn bởi ASCII-13 và các dòng lệnh dài hơn 126 ký tự thường sẽ bị cắt bớt bằng cách chèn ASCII-13 ở vị trí 127,  nhưng không thể dựa vào điều này trong tất cả các trường hợp.   Biến sẽ bị dập tắt cho các lệnh bên ngoài gọi với một trước `@` -symbol như trong `@XCOPY...` để tương thích ngược và để giảm thiểu kích thước của môi trường khi tải không chuyển nơi ở TSR. Một số phiên bản beta của Microsoft Chicago đã sử dụng `%CMDLINE%` để chỉ lưu trữ phần còn lại của dòng lệnh vượt quá 126 ký tự thay vì dòng lệnh hoàn chỉnh.

; `%COMSPEC%` (được hỗ trợ kể từ DOS 2.0) 
: Biến này chứa đường dẫn 8.3 đầy đủ đến bộ xử lý lệnh, thường là `C:\ [[COMMAND.COM|COMMAND.]]` `[[COMMAND.COM|COM]]` hoặc `C:\DOS\COMMAND.` `COM`. Nó không được chứa tên tệp dài, nhưng trong DR-DOS, nó có thể chứa mật khẩu tệp và thư mục. Nó được thiết lập bởi bộ xử lý lệnh chính để trỏ đến chính nó (thường phản ánh các cài đặt của `[[CONFIG.SYS|CONFIG.]]` `[[CONFIG.SYS|SYS]]` chỉ thị `[[CONFIG.SYS|SHELL]]`), để phần thường trú của bộ xử lý lệnh có thể tải lại phần tạm thời của nó từ đĩa sau khi thực thi các chương trình lớn hơn. Giá trị có thể được thay đổi trong thời gian chạy để phản ánh những thay đổi trong cấu hình, điều này sẽ yêu cầu bộ xử lý lệnh tự tải lại từ các vị trí khác. Biến cũng được sử dụng khi khởi chạy trình bao thứ cấp.

; `%COPYCMD%` (được hỗ trợ từ MS-DOS 6.2 và PC DOS 6.3, cũng được hỗ trợ bởi ROM-DOS) 
: Cho phép người dùng chỉ định công tắc `/Y` (giả sử "Có" trên các truy vấn) làm mặc định cho các lệnh `COPY`, `XCOPY` và `MOVE`. Một mặc định của `/Y` có thể được ghi đè bằng cách cung cấp công tắc `/-Y` trên dòng lệnh. Công tắc `/Y` hướng dẫn lệnh thay thế các tệp hiện có mà không cần nhắc xác nhận.

; `%LANG%` (được hỗ trợ từ MS-DOS 7.0) 
: Biến này được hỗ trợ bởi một số công cụ để chuyển đổi ngôn ngữ cho các thư trong các vấn đề đa ngôn ngữ.

; `%LANGSPEC%` (được hỗ trợ từ MS-DOS 7.0) 
: Biến này được hỗ trợ bởi một số công cụ để chuyển đổi ngôn ngữ cho các thư trong các vấn đề đa ngôn ngữ.

; `%NO_SEP%` (được hỗ trợ từ PC DOS 6.3 và DR-DOS 7.07) 
: Biến này điều khiển việc hiển thị các dấu phân cách hàng nghìn trong các thông báo của các lệnh khác nhau. Được cấp theo mặc định, chúng có thể bị loại bỏ bằng cách chỉ định `SET NO_SEP=ON` hoặc `SET NO_SEP=1` trong PC &nbsp; DOS. DR-DOS cũng cho phép ghi đè dấu phân tách hàng nghìn của hệ thống được hiển thị như trong fe `SET NO_SEP=.`.

; `%PATH%` (được hỗ trợ kể từ DOS 2.0) 
: Biến này chứa một danh sách các thư mục được phân tách bằng dấu chấm phẩy trong đó trình thông dịch lệnh sẽ tìm kiếm các tệp thực thi. Tương đương với biến Unix `$PATH` (nhưng một số ứng dụng DOS và Windows cũng sử dụng danh sách để tìm kiếm các tệp dữ liệu tương tự như `$LD_LIBRARY_PATH` trên các hệ thống giống Unix). Nó thường được thay đổi thông qua lệnh `PATH` (hoặc `PATH /E` trong MS-DOS 6.0), lệnh này cũng đảm bảo rằng tên thư mục được chuyển đổi thành chữ hoa. Một số phần mềm DOS thực sự mong muốn các tên được lưu trữ bằng chữ hoa và độ dài của danh sách không vượt quá 123  ký tự,  do đó tốt hơn là không nên sửa đổi biến thông qua lệnh `SET`.  Tên tệp dài có chứa khoảng trắng hoặc các ký tự đặc biệt khác không được đặt trong dấu ngoặc kép (`"`). Theo mặc định, thư mục hiện tại được tìm kiếm đầu tiên, nhưng một số bộ xử lý dòng lệnh như 4DOS cho phép " `.` " (Đối với "thư mục hiện tại") cũng được đưa vào danh sách để ghi đè thứ tự tìm kiếm này; một số chương trình DOS không tương thích với tiện ích mở rộng này.

; `%PROMPT%` (được hỗ trợ kể từ DOS 2.0) 
: Biến này chứa một chuỗi `$` -tokenized xác định việc hiển thị lời nhắc. Nó thường được thay đổi thông qua lệnh `[[Giao diện dòng lệnh|PROMPT]]`.

; `%TEMP%` (và `%TMP%`) 
: Các biến này chứa đường dẫn đến thư mục nơi lưu trữ các tệp tạm thời. Các công cụ hệ điều hành thường chỉ sử dụng `%TEMP%`, trong khi các chương trình của bên thứ ba cũng sử dụng `%TMP%`. Thông thường `%TEMP%` được ưu tiên hơn `%TMP%`.

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

; `%BETA%` 
: Biến này chứa một thông báo tùy chọn được hiển thị bởi một số phiên bản (bao gồm cả DR DOS 3.41) của `COMMAND.` `COM` khi khởi động shell thứ cấp.

; `%DRDOSCFG%` / `%NWDOSCFG%` / `%OPENDOSCFG%` 
: Biến này chứa thư mục  (không có dấu " `\` ") để tìm kiếm `.` `INI` và `.` Tệp cấu hình `CFG` (nghĩa là các tệp ứng dụng DR-DOS cụ thể như `TASKMGR.` `INI`, `TASKMAX.` `INI`, `VIEWMAX.` `INI`, `FASTBACK.` `CFG`, v.v., phân loại các tệp cụ thể như `COLORS.` `INI` hoặc các tệp chung như `DRDOS.` `INI`, `NWDOS.` `INI`, `OPENDOS.` `INI` hoặc `DOS.` `INI`), như được sử dụng bởi các lệnh `INSTALL` và `SETUP` và các chương trình DR-DOS khác nhau như `DISKOPT`, `DOSBOOK`, `EDIT`, `FBX`, `FILELINK`, `LOCK`, `SECURITY.` `OVL` / `NWLOGIN.` `EXE`, `SERNO`, `TASKMAX`, `TASKMGR`, `VIEWMAX` hoặc `UNDELETE`.  Nó không được chứa các tên tệp dài.

; `%DRCOMSPEC%` 
: Biến này tùy chọn giữ một đường dẫn thay thế đến bộ xử lý lệnh được ưu tiên hơn đường dẫn được xác định trong biến `%COMSPEC%`, tùy chọn bao gồm mật khẩu tệp và thư mục. Ngoài ra, nó có thể giữ một giá trị đặc biệt là " `ON` " hoặc " `1` " để thực thi việc sử dụng biến `%COMSPEC%` ngay cả trong các tình huống mà biến `%COMSPEC%` có thể trỏ đến bộ xử lý dòng lệnh sai, ví dụ: khi chạy một số phiên bản của lệnh DR-DOS `SYS` trong hệ điều hành nước ngoài.

; `%DRSYS%` 
: Đặt biến này thành " `ON` " hoặc " `1` " sẽ buộc một số phiên bản của lệnh DR-DOS `SYS` hoạt động trong các hệ điều hành nước ngoài thay vì hiển thị cảnh báo.

; `%FBP_USER%` 
: Chỉ định tên người dùng được sử dụng bởi lệnh FastBack `FBX` và `{user}.` Tệp cấu hình `FB` trong Novell DOS 7.

; `%HOMEDIR%` 
: Biến này có thể chứa thư mục chính trong DR-DOS (bao gồm DR DOS 5.0 và 6.0).

; `%INFO%`
: Trong một số phiên bản DR-DOS COMMAND.COM, biến này xác định chuỗi được hiển thị bằng mã thông báo $ I của lệnh PROMPT. Ví dụ, nó có thể được sử dụng để thông báo cho người dùng cách thoát khỏi các shell thứ cấp.

; `%TASKMGRWINDIR%` 
: Biến này chỉ định thư mục, nơi chứa `SYSTEM.` Windows `SYSTEM.` `INI` được sử dụng bởi trình đa nhiệm DR-DOS `TASKMGR`, ghi đè thủ tục mặc định để định vị tệp.

; `%$CLS%` 
: Biến này xác định trình tự điều khiển được gửi đến trình điều khiển bảng điều khiển để xóa màn hình khi lệnh `CLS` được đưa ra, do đó ghi đè giá trị mặc định bên trong (" `←[2J` " trong DR-DOS, " `←E` " trong DOS Plus 1.2 trên Amstrad máy  cũng như trong DOS Đồng thời, Multiuser DOS và REAL / 32 cho thiết bị đầu cuối VT52 hoặc " `←+` " trong Multiuser DOS cho thiết bị đầu cuối ASCII).  Nếu biến không được xác định và không có `ANSI.` `SYS` điều khiển bảng điều khiển `SYS` được phát hiện, DR-DOS `COMMAND.` `COM` sẽ trực tiếp xóa màn hình thông qua chức năng `INT 10h/AH=00h` BIOS, giống như MS-DOS / PC &nbsp; `COMMAND.` DOS `COMMAND.` `COM` không. Chú thích `\nnn` đặc biệt cho các số bát phân được hỗ trợ để cho phép định nghĩa các ký tự đặc biệt như ESC (ASCII-27 = "←" = 1Bh = 33o), như fe trong `SET $CLS=\033[2J`. Để gửi dấu gạch chéo ngược (" `\` "), nó có thể được nhân đôi " `\\` ".

; `%$PAGE%` 
: Được hỗ trợ bởi DOS Plus chấp nhận các giá trị " `ON` " hoặc " `OFF` " để kiểm soát phân trang. Đặt điều này thành " `ON` " có ảnh hưởng tương tự như thêm `/P` vào các lệnh hỗ trợ nó (như DIR hoặc TYPE).

; `%SystemRoot%` 
: Biến `%SystemRoot%` là một biến môi trường toàn hệ thống đặc biệt được tìm thấy trên họ hệ điều hành Windows NT. Giá trị của nó là vị trí của thư mục hệ thống, bao gồm ổ đĩa và đường dẫn. Ổ đĩa giống như `%SystemDrive%` và đường dẫn mặc định trên một bản cài đặt sạch sẽ tùy thuộc vào phiên bản của hệ điều hành. Theo mặc định: 
:* Windows XP và các phiên bản mới hơn sử dụng " `\WINDOWS` ". 
:* Windows 2000, NT 4.0 và NT 3.1 sử dụng " `\WINNT` ". 
:* Windows NT 3.5 và NT 3.51 sử dụng " `\WINNT35` ". 
:* Máy chủ đầu cuối Windows NT 4.0 sử dụng " `\WTSRV` ".

; `%windir%` 
: Biến này trỏ đến thư mục *Windows*. (Trên họ hệ điều hành Windows NT, nó giống với biến `%SystemRoot%`). Theo mặc định, Windows 95, Windows 98 và Windows ME được cài đặt trong " `C:\Windows` ". Đối với các phiên bản Windows khác, hãy xem mục `%SystemRoot%` ở trên.

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

; `%ALLUSERSPROFILE%` (`%PROGRAMDATA%` kể từ Windows Vista)
: Biến này mở rộng đến đường dẫn đầy đủ đến thư mục hồ sơ *Tất cả người dùng*. Hồ sơ này chứa các tài nguyên và cài đặt được sử dụng bởi tất cả các tài khoản hệ thống. Các liên kết lối tắt được sao chép vào *menu Bắt đầu* của *Tất cả Người dùng* \ 'hoặc các thư mục *Màn hình nền* sẽ xuất hiện trong *menu Bắt đầu* hoặc *Màn hình* nền của mỗi người dùng.

; `%USERDOMAIN%` 
: Tên của *Nhóm làm việc* hoặc *Miền Windows* mà người dùng hiện tại thuộc về. Biến có liên quan, `%LOGONSERVER%`, giữ tên máy chủ của máy chủ đã xác thực thông tin đăng nhập của người dùng hiện tại (tên và mật khẩu). Đối với PC gia đình và PC trong một nhóm làm việc, máy chủ xác thực thường là chính PC đó. Đối với PC trong miền Windows, máy chủ xác thực là bộ điều khiển miền (bộ điều khiển miền chính hoặc PDC, trong các miền dựa trên Windows NT 4).

; `%USERPROFILE%` 
: Một biến môi trường toàn hệ thống đặc biệt được tìm thấy trên Windows NT và các dẫn xuất của nó. Giá trị của nó là vị trí của thư mục hồ sơ của người dùng hiện tại, trong đó được tìm thấy tổ hợp đăng ký HKCU (`NTUSER`) của người dùng đó. Người dùng cũng có thể sử dụng biến `%USERNAME%` để xác định nhận dạng đăng nhập của người dùng đang hoạt động.

*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 `[[Cmd.exe|CMD]]`.

(Một số biến này cũng được xác định khi chạy `COMMAND.` `COM` trong Windows, nhưng khác ở một số chi tiết quan trọng nhất định: Dưới `COMMAND.` `COM`, 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 `CMD` bị thiếu, thì cũng có một số biến đặc trưng cho môi trường `COMMAND`.) 

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ả

; `%MONTH_NAME%` 
: Biến giả này trả về tên tháng của ngày hiện tại. Chuỗi trả về phụ thuộc vào phiên bản DR-DOS cụ thể theo ngôn ngữ, fe " `January` ", " `February` ", " `March` ", " `April` ", " `May` ", " `June` ", " `July` ", " `August` ", " `September` ", " `October` " hoặc " `December` " trong phiên bản tiếng Anh. Nó giống như một *biến định danh được* đặt tên giống nhau trong các tập lệnh đăng nhập Novell NetWare.

; `%NDAY_OF_WEEK%` 
: Biến giả này trả về số ngày trong tuần hiện tại, fe " `1` ".. " `7` " (với " `1` " cho Chủ nhật). Nó giống như một *biến định danh được* đặt tên giống nhau trong các tập lệnh đăng nhập Novell NetWare.

; `%SHORT_YEAR%` 
: Biến giả này trả về năm của ngày hiện tại ở định dạng 2 chữ số với các số 0 ở đầu, fe " `93` ".. " `99` ", " `00` ".. " `92` ". Nó giống như một *biến định danh được* đặt tên giống nhau trong các tập lệnh đăng nhập Novell NetWare.

; `%YEAR%` và `%_YEAR%` 
: Được hỗ trợ kể từ Novell DOS 7, biến giả `%YEAR%` trả về năm của ngày hiện tại ở định dạng 4 chữ số, fe " `1980` ".. " `2099` ". Nó giống như một *biến định danh được* đặt tên giống nhau trong các tập lệnh đăng nhập Novell NetWare. DR-DOS 7.02 và `%_YEAR%` được bổ sung cao hơn để tương thích với 4DOS, trả về cùng một giá trị.

; `%_CODEPAGE%` 
: Biến giả này trả về trang mã hiện tại của hệ thống (" `1` ".. " `65533` "), fe " `437` ", " `850` ", " `858` ". Biến này ban đầu được giới thiệu bởi 4DOS,  nhưng cũng có sẵn với `COMMAND.` `COM` kể từ DR-DOS 7.02. Xem thêm lệnh `CHCP`.

; `%_COUNTRY%` 
: Biến giả này trả về mã quốc gia hiện tại của hệ thống (" `1` ".. " `65534` "), fe " `1` " cho Hoa Kỳ, " `44` " cho Vương quốc Anh, " `49` " cho Đức, " `20049` " với ISO 8601, " `21049` "với hỗ trợ ISO 8601 và Euro. Biến này ban đầu được giới thiệu bởi 4DOS,  nhưng cũng có sẵn với `COMMAND.` `COM` kể từ DR-DOS 7.02. Xem thêm `CONFIG.` Chỉ thị `SYS` `[[CONFIG.SYS|COUNTRY]]`.

*Các biến thông tin hệ thống* được hỗ trợ bởi DR-DOS `COMMAND.` `COM` với mạng được tải:

; `%P_STATION%` 
: Biến giả này trả về số trạm vật lý ở định dạng " `?` `?`  `?`  `?`  `?`  `?`  `?`  `?`  `?`  `?`  `?`  `?`  ". Giá trị phụ thuộc vào địa chỉ MAC của bộ điều hợp mạng, nhưng có thể bị ghi đè. Nó giống như một *biến định danh được* đặt tên giống nhau trong các tập lệnh đăng nhập Novell NetWare.

; `%STATION%` 
: Biến giả này trả về số trạm logic bắt đầu bằng " `1` " cho máy khách đầu tiên. Các số được máy chủ tệp chỉ định và giữ nguyên trạng thái tĩnh miễn là kết nối IPX vẫn được thiết lập. Nó giống như một *biến định danh được* đặt tên giống nhau trong các tập lệnh đăng nhập Novell NetWare.

*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 `[[Cmd.exe|CMD]]` 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 `SET` 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 `COMMAND.` của Windows `COMMAND.` `COM`, đã được sửa đổi để gọi nội bộ `CMD.` `EXE` để thực hiện các lệnh.

; `%CD%` 
: Biến giả này mở rộng đến thư mục hiện tại tương đương với đầu ra của `[[Cd (lệnh)|CD]]` lệnh khi được gọi mà không có đối số. Trong khi một tên tệp dài có thể được trả lại trong `CMD.` `EXE` tùy thuộc vào thư mục hiện tại, thực tế là thư mục hiện tại sẽ luôn ở định dạng 8.3 dưới `COMMAND.` `COM` sẽ khiến nó trả về một tên tệp ngắn trong `COMMAND.` `COM`, ngay cả khi `COMMAND` gọi nội bộ `CMD`.

; `%CMDCMDLINE%` 
: Biến giả này mở rộng thành các tham số khởi động ban đầu của `[[Cmd.exe|CMD.]]` `[[Cmd.exe|EXE]]`, fe " `C:\Windows\system32\cmd.exe` ". Dưới `COMMAND.` của Windows `COMMAND.` `COM`, điều này có thể trả về một cái gì đó như " `C:\Windows\system32\cmd.exe /c...` " do thực tế là `COMMAND.` `COM` gọi `CMD.` `EXE` nội bộ.

; `%CMDEXTVERSION%` 
: Biến giả này mở rộng thành phiên bản của phần mở rộng dòng lệnh của `[[Cmd.exe|CMD.]]` `[[Cmd.exe|EXE]]`, nếu được bật (ví dụ: " `1` " trong Windows NT, " `2` " trong Windows 2000 và Windows XP).

; `%DATE%` 
: Biến giả này mở rộng đến ngày hiện tại. Ngày được hiển thị theo tùy chọn định dạng ngày của người dùng hiện tại.

; `%RANDOM%` 
: Biến giả này trả về một số ngẫu nhiên giữa " `0` " và " `32767` ".

; `%TIME%` 
: Biến giả này trả về thời gian hiện tại. Thời gian được hiển thị theo tùy chọn định dạng thời gian của người dùng hiện tại. Nếu cả hai biến `%TIME%` và `%DATE%` đều được sử dụng, thì điều quan trọng là phải đọc cả hai biến đó theo thứ tự cụ thể này liên tiếp nhanh chóng để tránh các vấn đề chuyển qua nửa đêm.

## 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

## Ghi chú

## Tham khảo

## đọc thêm

* 

## 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