Biến môi trường và biến Shell, sự khác biệt là gì?


Câu trả lời:


35

$BASHlà một biến cục bộ chỉ có giá trị trong shell (bash) hiện tại.

Các biến môi trường như $SHELLlà hợp lệ trên toàn hệ thống. Trong shell Bash hiện tại, $BASHtrỏ đến đường dẫn thực thi của bash , trong khi $SHELLtrỏ đến shell được xác định là mặc định (có thể có cùng giá trị).

Để biết giải thích về các biến môi trường, hãy xem Biến môi trường trong Trợ giúp Ubuntu.


1
Một liên kết tuyệt vời (+1) :)
Peter.O

12
Câu trả lời này không chính xác / không chính xác. Biến môi trường KHÔNG toàn cầu / toàn hệ thống. Các biến shell là riêng tư đối với shell hiện đang chạy và chúng KHÔNG được xuất (truyền lại) cho bất kỳ tiến trình con nào. Các biến môi trường được xuất sang bất kỳ tiến trình con nào. "MYVAR = private; export OURVAR = shared; printenv" sẽ chỉ báo cáo "OURVAR" vì khi shell thực thi lệnh printenv, nó xuất OURVAR, nhưng không xuất ra MYVAR.
CM

2
+1 để bình luận của CM! Tôi chưa bao giờ nghe sự khác biệt được giải thích một cách đơn giản và chính xác !!! Nhận xét này nên là câu trả lời.
Jesse the Wind Wanderer

48

Một biến môi trường là có sẵn trên toàn cầu, trong một chương trình và đó là các chương trình con. Một biến shell chỉ có sẵn trong shell hiện tại. Để làm cho một biến shell có sẵn như là một biến môi trường, sử dụng export VARNAME(không có đô la $).

Ví dụ để làm rõ:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

Một cách khác để xác định một biến môi trường:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE

Tôi không nghĩ rằng điều này là chính xác. exportkhông nhất thiết phải đặt biến môi trường. stackoverflow.com/questions/7411455/
Mạnh

3
@ChrisStryczynski exportkhông đặt biến môi trường cho các tiến trình con. Bài đăng bạn liên kết không mâu thuẫn với câu trả lời này, bạn có thể làm rõ lý do tại sao bạn nghĩ nó sai?
Lekensteyn

exporthoàn toàn thiết lập một biến môi trường
David Tonhofer

9

Có một sự khác biệt. Biến Shell và Biến môi trường sẽ giải thích điều đó tốt hơn mà tôi có thể, nhưng đây là đoạn trích từ nó:

Nếu một thay đổi được thực hiện cho một biến shell, thì nó phải được "xuất" rõ ràng sang biến môi trường tương ứng để cho bất kỳ quy trình con rẽ nhánh nào nhìn thấy sự thay đổi. Hãy nhớ lại rằng các biến shell là cục bộ của shell mà chúng được xác định.


Tôi đang bình luận câu trả lời của riêng mình .. Tôi thực sự thích liên kết Trợ giúp Ubuntu trong câu trả lời của Takkat ... (nó tốt hơn của tôi)
Peter.O

3
Cộng với liên kết của bạn không còn hoạt động!

1

Shell Shell Biến: Ngắn hạn, Chỉ áp dụng cho phiên bản hiện tại của shell, Không áp dụng toàn hệ thống

Biến môi trường: Sử dụng lâu dài, Hệ thống hợp lệ, Được phép toàn cầu

Theo quy ước Shell Var biến có tên của họ là chữ thường trong khi Envn. Các biến được viết dưới dạng chữ hoa


-1

Để trả lời câu hỏi này trước tiên hãy cố gắng hiểu phạm vi của một biến.

Khi bạn tạo một biến mới giống như SOME_ENV_VARIABLE="testing.txt"nó nằm trong SHELL scope, điều đó có nghĩa là nó có thể được truy cập bởi thể hiện của trình bao nơi người dùng đăng nhập. Khi ví dụ thay đổi, bạn mở một thiết bị đầu cuối mới hoặc bạn thay đổi trình bao (ví dụ: bạn chuyển sang csh) bạn không thể truy cập vào biến đó.

Khi bạn xuất biến đó như biến export SOME_ENV_VARIABLEđó hiện có sẵn trong phạm vi môi trường, điều đó có nghĩa là trong trường hợp đó nếu bạn thay đổi trình bao, bạn vẫn có thể truy cập vào biến đó. Hãy cố gắng hiểu với ví dụ sau:

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

Tương tự: giả sử bạn có một căn hộ hai phòng ngủ và bạn đang chia sẻ nó với một người bạn cùng phòng khác. Khu vực chung có thể được truy cập bởi bất kỳ ai, nhưng không phải phòng ngủ của bạn, biến môi trường giống như khu vực chung và biến vỏ giống như phòng ngủ, nếu bạn có thể truy cập vào khu vực chung thì bất cứ ai cũng có thể truy cập nhưng nếu bạn giữ nó trong phòng ngủ thì chỉ có thể được truy cập bởi bạn.

Hãy nhớ nếu mở một thiết bị đầu cuối mới, bạn sẽ không thể truy cập một trong hai biến vì bạn đang thay đổi thể hiện đó . Vì vậy, bạn nên thêm các biến của mình vào một trong hai .profilehoặc .bashrc(nếu bạn đang sử dụng bash).

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.