Biến Shell so với biến môi trường, cái nào được ưu tiên nếu cả hai có cùng tên?


10

Gõ như sau trong Bash:

env | grep USER

set | grep USER

cung cấp cho cả hai lần cùng một tên người dùng.

Làm thế nào để tôi biết, ví dụ khi gõ echo $USERnếu shell hoặc biến môi trường đã được hiển thị?

Câu trả lời:


14

Đối với hệ vỏ tương thích POSIX (bao gồm Bash), tiêu chuẩn cho biết:

2.5.3 Biến Biến Shell
sẽ được khởi tạo từ môi trường [...] Nếu một biến được khởi tạo từ môi trường, nó sẽ được đánh dấu để xuất ngay lập tức; xem xuất khẩu đặc biệt tích hợp. Các biến mới có thể được xác định và khởi tạo với các phép gán biến, [vv]

Và về export:

export name[=word]...
Shell sẽ cung cấp thuộc tính export cho các biến tương ứng với các tên được chỉ định, điều này sẽ khiến chúng nằm trong môi trường của các lệnh được thực hiện sau đó.

Vì vậy, từ quan điểm của shell, chỉ có các biến. Một số trong số chúng có thể đến từ môi trường khi vỏ được khởi động và một số trong số chúng có thể được xuất sang môi trường của các quá trình mà vỏ bắt đầu.

("Môi trường" thực sự chỉ là một chuỗi các chuỗi được truyền cho tiến trình khi nó bắt đầu. Khi tiến trình đang chạy, nó có thể làm bất cứ điều gì nó thích với nó, sử dụng nó, bỏ qua nó, ghi đè lên nó. khi bắt đầu các quá trình khác có thể là một điều khác, mặc dù tất nhiên, thông thường chỉ cần vượt qua tất cả các biến môi trường một lần nữa.)


Nếu bạn đang sử dụng một số vỏ không phải POSIX, chẳng hạn như csh, mọi thứ có thể khác:

$ csh
% echo $foo
foo: Undefined variable.
% setenv foo bar
% echo $foo
bar
% set foo=asdf
% echo $foo
asdf
% env |grep foo
foo=bar
% exit

1
Lưu ý rằng shell Bourne, như csh khởi tạo các biến shell từ các biến môi trường. Nhưng sửa đổi các biến shell không ảnh hưởng đến biến môi trường tương ứng trừ khi bạn xuất chúng. Đó là thứ đã bị phá vỡ bởi vỏ Korn (và được chỉ định bởi POSIX). Đó là lý do tại sao bạn nên cẩn thận với tên của các biến shell mà bạn sử dụng bây giờ để đảm bảo rằng bạn không sửa đổi các env có thể ảnh hưởng đến các lệnh mà bạn chạy trong tập lệnh của mình.
Stéphane Chazelas

4

Đây là một và cùng một biến. Trong shell, trái ngược với hầu hết các ngôn ngữ lập trình khác, các biến môi trường và biến shell có cùng không gian tên. Trong shell, một biến môi trường là một biến shell đã được xuất với export.

Xem, ví dụ, câu trả lời của tôi cho câu hỏi trước của bạn " Sự khác biệt trong cách sử dụng giữa các biến shell và biến môi trường là gì? "


Tôi sẽ đọc lại lời giải thích của bạn, chỉ tôi cần học một số điều trước khi tôi có thể hiểu câu trả lời của bạn.
cá mập

@sharkant Không phải lo lắng gì cả. Nếu tôi nhầm lẫn mọi thứ, thì hãy nói cho tôi biết và tôi sẽ cố gắng làm rõ. Câu trả lời của ilkkachu cũng tốt.
Kusalananda

không, tôi không nghĩ vậy, bạn có một phong cách giải thích tốt, đó chỉ là sự thiếu hiểu biết của tôi mà chưa thể trân trọng họ.
cá mập

2

Shell Biến chỉ có thể được sử dụng cho shell hiện tại, nó không thể được sử dụng trong toàn hệ thống. Mặt khác, Biến môi trường có thể được sử dụng System Wide. Theo quy ước Shell Biến được viết dưới dạng chữ thường trong khi Biến môi trường được viết dưới dạng chữ hoa. Bạn có thể làm cho một biến shell hoạt động như một biến môi trường, bạn chỉ cần xuất nó.

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.