Sự khác biệt giữa các biến shell được xuất và các biến không có trong bash


41

Bash dường như phân biệt giữa các biến đã được xuất và những biến không.

thí dụ:

$ FOO=BAR
$ env | grep FOO
$ set | grep FOO
FOO=BAR

setthấy biến nhưng envkhông.

$ export BAR=FOO
$ env | grep FOO
BAR=FOO
$ set | grep FOO
BAR=FOO
FOO=BAR

setthấy cả hai biến nhưng envchỉ thấy biến xuất.

Tôi biết đó setlà một bash dựng sẵn và envkhông.

Sự khác biệt giữa các biến được xuất và biến không là gì?


17
Thuật ngữ lưu ý: một biến môi trường của người dùng luôn được xuất khẩu. Một biến không được xuất là một biến shell shell của cải (hoặc tham số lồng vào).
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


44

Các biến được xuất được mang vào môi trường của các lệnh được thực thi bởi shell đã xuất chúng, trong khi các biến không xuất là cục bộ cho lệnh gọi shell hiện tại. Từ exporttrang người đàn ông:

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 đó.

setxuất ra môi trường hiện tại, bao gồm bất kỳ biến không xuất cục bộ nào. envđược sử dụng để khởi chạy các chương trình trong một môi trường mới và không có đối số sẽ tạo ra môi trường mới đó sẽ là gì. Vì envđang tạo một môi trường mới, chỉ có các biến xuất khẩu được đưa qua, như trường hợp của bất kỳ chương trình nào được khởi chạy từ shell đó. Ví dụ: sinh ra lớp vỏ thứ hai trong lớp thứ nhất (tôi đã sử dụng $$để thể hiện lời nhắc trong lớp vỏ bên trong):

$ FOO=BAR
$ bash
$$ echo $FOO             # Note the empty line

$$ exit
$ export FOO
$ bash
$$ echo $FOO
BAR
$$

Lưu ý rằng đó là biến được xuất, không chỉ giá trị của nó. Điều này có nghĩa là một khi bạn export FOO, FOOtrở thành một biến toàn cục và xuất hiện trong các môi trường tiếp theo, ngay cả khi thay đổi sau này:

$ export FOO
$ FOO=BAR
$ bash
$$ echo $FOO
BAR
$$

Vì vậy, nếu bạn chỉ quan tâm đến shell hiện tại, bạn có cần xuất không? Một cách riêng biệt, tại sao localecho shell hiện tại không hiển thị các bản cập nhật?
Pacerier
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.