2010-07-27 39 views

Trả lời

17

Trích dẫn this source,

biến tiêu chuẩn UNIX được chia thành biến hai loại, biến môi trường và vỏ. Nói chung, biến shell chỉ áp dụng cho phiên bản hiện tại của vỏ và là được sử dụng để đặt điều kiện làm việc ngắn hạn ; biến môi trường có tầm quan trọng tiếp cận xa hơn và các biến được đặt lúc đăng nhập có giá trị trong khoảng thời gian của phiên. Theo quy ước , các biến môi trường có TRƯỜNG HỢP UPPER và biến shell có tên chữ thường.

Để liệt kê tất cả các biến môi trường, hãy sử dụng printenv và liệt kê tất cả các biến hệ vỏ, sử dụng set.

Bạn sẽ lưu ý rằng các biến môi trường lưu trữ giá trị lâu dài hơn, ví dụ:

HOME=/home/adam 

Những thay đổi khá ít, trong khi các biến shell cửa hàng,, các giá trị vỏ cụ thể tạm thời địa phương, ví dụ:

PWD=/tmp 

thay đổi mỗi khi bạn thay đổi thư mục hiện tại của mình.

Đối với hầu hết các tác vụ thực tế, hãy đặt giá trị môi trường bằng cách thêm export VARIABLE_NAME=VALUE vào tệp ~/.bashrc của bạn.

+0

biến môi trường được người dùng xác định? & biến s shell là hệ thống xác định? u cũng đã đề cập đến các lệnh không phải là vị trí tôi có nghĩa là nơi biến được đặt ??? – sunil

+0

Ý của bạn là gì 'Vị trí của các biến'? Nơi nào bạn đặt giá trị của họ, hoặc là (kỹ thuật) được lưu trữ trong bộ nhớ của máy tính? –

+0

bất kỳ tệp nào ở đó, nơi chúng được lưu trữ && là chúng được xác định hoặc được xác định trước – sunil

-1

Biến hệ vỏ chỉ là trường hợp đặc biệt của biến môi trường. biến shell được kế thừa từ môi trường và có thể được sao chép vào môi trường của con của trình vỏ tùy thuộc vào cú pháp được sử dụng: http://www.pixelbeat.org/docs/env.html

+2

Điều này không chính xác. Về cơ bản bạn có các điều khoản bị đảo ngược. Rõ ràng là có rất nhiều sự nhầm lẫn về chủ đề này, thậm chí bởi những người dùng kỳ cựu và một nhà phát triển cốt lõi? : -/ – deltaray

+1

Tôi không nghĩ mình đã đảo ngược các điều khoản. Tôi đã ngụ ý rằng danh sách môi trường là cơ bản hơn và hiện tại cho tất cả các quá trình bao gồm cả vỏ. biến shell là một trường hợp đặc biệt được khởi tạo _from_ danh sách môi trường – pixelbeat

9

Sự khác biệt của chúng tương tự với sự khác biệt giữa trường riêng tư và trường được bảo vệ trong lớp Java.

Các trường riêng tư của một lớp Java chỉ có thể truy cập được từ lớp Java đó. Các trường được bảo vệ của một lớp Java có thể truy cập được từ cả lớp Java và các lớp con của nó.

Biến trình bao của trình bao chỉ có thể truy cập được từ quy trình trình bao đó. Các biến môi trường được xuất ra từ trình bao đó có thể truy cập được từ cả trình vỏ đó và các tiến trình con được tạo ra từ trình bao đó.

2

Đối với Bash shell:

biến Shell khác với các biến môi trường theo những cách khác nhau:

♦ Biến vỏ là cụ thể cho vỏ thân và không được thừa hưởng bởi tiến trình con.Ví dụ, giả sử bạn đang chạy một ứng dụng từ vỏ, mà ứng dụng sẽ không kế thừa các biến shell:

$ SHELL_VAR=xyz 
$ firefox 

SHELL_VAR sẽ không có sẵn trong môi trường của quá trình con (firefox).

♦ Ngược lại, các biến môi trường của quá trình cha mẹ (vỏ ở đây) đều được thừa hưởng bởi tất cả các tiến trình con: biến

$ export SHELL_VAR=xyz 
$ firefox 

♦ Cả vỏ và môi trường là địa phương để các vỏ/quá trình mà xác định chúng:

Biến môi trường có thể liên tục, trong khi đó, đối với biến trình bao khi bạn thoát phiên, tất cả đều biến mất. Lưu ý: các ví dụ trên chỉ làm thay đổi vỏ mà bạn đang làm việc, nói cách khác, nếu bạn đăng xuất hoặc bắt đầu một shell/terminal mới, bạn sẽ không thấy các biến mà bạn đã xác định, điều này là cho mỗi nguyên tắc của địa phương quy trình .


Làm thế nào để làm cho biến presistent shell:

Một cách để làm điều đó là bằng cách sửa đổi các tập tin ~/.profile:

export SHELL_VAR=xyz 

Cài đặt này sử dụng cụ thể và không phải toàn hệ thống, đối với biến môi trường trên toàn hệ thống, bạn có thể thêm dòng trên vào tệp .sh trong /etc/profile.d

Tôi khuyên bạn nên đọc trang này: EnvironmentVariables

Các vấn đề liên quan