Biến Shell
Biến shell là các biến có phạm vi trong phiên shell hiện tại, ví dụ như trong phiên shell tương tác hoặc tập lệnh.
Bạn có thể tạo biến shell bằng cách gán giá trị cho tên không sử dụng:
var="hello"
Việc sử dụng các biến shell là để theo dõi dữ liệu trong phiên hiện tại. Các biến Shell thường có tên với các chữ cái viết thường.
Biến môi trường
Một biến môi trường là một biến shell đã được xuất. Điều này có nghĩa là nó sẽ được hiển thị dưới dạng một biến, không chỉ trong phiên shell đã tạo ra nó, mà còn cho bất kỳ quá trình nào (không chỉ shell) được bắt đầu từ phiên đó.
VAR="hello" # shell variable created
export VAR # variable now part of the environment
hoặc là
export VAR="hello"
Khi một biến shell đã được xuất, nó vẫn được xuất cho đến khi nó không được đặt hoặc cho đến khi "thuộc tính xuất" của nó bị xóa (có export -n
in bash
), do đó thường không cần phải xuất lại. Bỏ cài đặt một biến bằng cách unset
xóa nó (bất kể đó có phải là biến môi trường hay không).
Mảng và băm kết hợp trong bash
và các shell khác có thể không được xuất để trở thành biến môi trường. Các biến môi trường phải là các biến đơn giản có giá trị là các chuỗi và chúng thường có các tên bao gồm các chữ cái viết hoa.
Việc sử dụng các biến môi trường là để theo dõi dữ liệu trong phiên shell hiện tại, nhưng cũng cho phép bất kỳ quá trình bắt đầu nào tham gia vào dữ liệu đó. Trường hợp điển hình của điều này là PATH
biến môi trường, có thể được đặt trong trình bao và sau đó được sử dụng bởi bất kỳ chương trình nào muốn khởi động chương trình mà không chỉ định đường dẫn đầy đủ đến chúng.
Tập hợp các biến môi trường trong một quy trình thường được gọi là "môi trường của quy trình". Mỗi quá trình có môi trường riêng.
Các biến môi trường chỉ có thể được "chuyển tiếp", tức là một tiến trình con không bao giờ có thể thay đổi các biến môi trường trong tiến trình cha của nó và ngoài việc thiết lập môi trường cho một tiến trình con khi bắt đầu nó, một tiến trình cha mẹ không thể thay đổi môi trường hiện tại của một quá trình con.
Các biến môi trường có thể được liệt kê với env
(không có bất kỳ đối số). Ngoài ra, chúng xuất hiện giống như các biến shell không xuất trong phiên shell. Đây là một chút đặc biệt đối với hệ vỏ vì hầu hết các ngôn ngữ lập trình khác thường không xen kẽ các biến "thông thường" với các biến môi trường (xem bên dưới).
env
cũng có thể được sử dụng để đặt các giá trị của một hoặc một số biến môi trường trong môi trường của một quy trình mà không đặt chúng trong phiên hiện tại:
env CC=clang CXX=clang++ make
Điều này bắt đầu make
với biến môi trường CC
được đặt thành giá trị clang
và CXX
được đặt thành clang++
.
Nó cũng có thể được sử dụng để xóa môi trường cho một quá trình:
env -i bash
Điều này bắt đầu bash
nhưng không chuyển môi trường hiện tại sang bash
quy trình mới (nó vẫn sẽ có các biến môi trường khi nó tạo các biến mới từ các tập lệnh khởi tạo shell của nó).
Ví dụ về sự khác biệt
$ var="hello" # create shell variable "var"
$ bash # start _new_ bash session
$ echo "$var" # no output
$ exit # back to original shell session
$ echo "$var" # "hello" is outputted
$ unset var # remove variable
$ export VAR="hello" # create environment variable "VAR"
$ bash
$ echo "$VAR" # "hello" is outputted since it's exported
$ exit # back to original shell session
$ unset VAR # remove variable
$ ( export VAR="hello"; echo "$VAR" ) # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR" # no output since a subshell has its own environment
Những ngôn ngữ khác
Có các hàm thư viện trong hầu hết các ngôn ngữ lập trình cho phép nhận và thiết lập các biến môi trường. Lưu ý rằng vì các biến môi trường được lưu trữ dưới dạng mối quan hệ khóa-giá trị đơn giản, nên chúng thường không phải là "biến" của ngôn ngữ. Một chương trình có thể tìm nạp giá trị (luôn luôn là một chuỗi ký tự) tương ứng với một khóa (tên của biến môi trường), nhưng sau đó sẽ phải chuyển đổi nó thành một số nguyên hoặc bất kỳ loại dữ liệu nào mà ngôn ngữ mong muốn có giá trị.
Trong C, các biến môi trường có thể được truy cập bằng getenv()
, setenv()
, putenv()
và unsetenv()
. Các biến được tạo với các thường trình này được kế thừa theo cùng một cách bởi bất kỳ quy trình nào mà chương trình C bắt đầu.
Các ngôn ngữ khác có thể có cấu trúc dữ liệu đặc biệt để thực hiện điều tương tự, như %ENV
hàm băm trong Perl hoặc ENVIRON
mảng kết hợp trong hầu hết các triển khai awk
.