Việc sử dụng lệnh xuất khẩu thế giới là gì?


12

Tôi đã tạo một biến môi trường trong một cửa sổ đầu cuối và cố gắng lặp lại nó trong một cửa sổ đầu cuối khác. Điều đó không hiển thị gì cả.

$TEST=hello

Sau đó tôi xuất nó và thử lại echonó trong một cửa sổ terminal khác. kết quả vẫn như trước.

export TEST 

nhưng nếu tôi thực thi cùng một mã khi đăng nhập (nối thêm mã vào ~/.profiletệp) thì có thể sử dụng bất kỳ cửa sổ đầu cuối nào. Chuyện gì đang xảy ra ở đây? Sự khác biệt giữa việc thực thi mã trong một thiết bị đầu cuối và thực thi giống nhau khi đăng nhập là gì?

Câu trả lời:


25

exportlàm cho một biến một cái gì đó sẽ được bao gồm trong môi trường quá trình con. Nó không ảnh hưởng đến các môi trường đã tồn tại khác. Nói chung, không có cách nào để đặt một biến trong một thiết bị đầu cuối và nó tự động xuất hiện trong một thiết bị đầu cuối khác, môi trường được thiết lập cho từng quy trình riêng.

Thêm nó vào của bạn .profilelàm cho nó để môi trường của bạn sẽ được thiết lập để bao gồm biến mới đó mỗi khi bạn đăng nhập. Vì vậy, nó không được xuất từ ​​vỏ này sang vỏ khác mà thay vào đó là hướng dẫn một vỏ mới bao gồm nó khi thiết lập môi trường ban đầu.


1

Mỗi quy trình có một số thuộc tính mà quy trình có thể đặt riêng và độc lập với các quy trình khác. Ví dụ là giới hạn tài nguyên, umask, thư mục hiện tại, biến môi trường và một số khác. Sau khi tạo quy trình (bằng cách fork()gọi hệ thống), đứa trẻ thừa hưởng các thuộc tính này từ cha mẹ. Sau đó, tiến trình con có thể đặt các thuộc tính này tùy ý. (Một số hạn chế được áp dụng, một quy trình có thể không tăng giới hạn tài nguyên cứng hoặc thay đổi thư mục hiện tại của nó thành thư mục không có quyền thực thi.)

Chỉ có một vài chương trình sửa đổi các biến môi trường của họ, hầu hết không bận tâm. Giả sử trường hợp sau. Vì vậy, nếu một quá trình con tạo ra chính nó thêm con, thì các quá trình này sẽ có các biến môi trường giống như ông bà. Và như thế.

Bây giờ, một shell có rất nhiều biến có thể được xem với set(trong shell của loại Bourne Shell, dunno về C Shell). Các biến này không phải là biến môi trường trừ khi chúng là exported. Biến môi trường có thể được xem với env. Nếu bạn khởi chạy một chương trình từ dòng lệnh shell, chương trình sẽ kế thừa các biến môi trường từ shell. Tương tự như vậy đối với một chương trình được khởi chạy từ một kịch bản shell.

Do đó, khi đăng nhập, có một vỏ đọc dữ liệu hồ sơ (ví dụ ~/.profile) và kế thừa chúng cho hầu hết tất cả trẻ em, cháu, v.v. Đây là cách cài đặt biến môi trường chảy xuống từ vỏ đăng nhập hoặc tập lệnh đăng nhập cho tất cả các chương trình khác được khởi chạy trong phiên đăng nhập.

Tôi đã tạo một biến môi trường trong một cửa sổ đầu cuối và cố gắng lặp lại nó trong một cửa sổ đầu cuối khác. Điều đó không hiển thị gì cả.

Theo giải thích trên, đây là kết quả mong đợi. Những thay đổi trong môi trường của một quá trình chỉ ảnh hưởng đến những đứa trẻ của quá trình này được tạo ra từ đó, chứ không phải những cái hiện có.

$TEST=hello

Điều này dường như không hoạt động, trừ khi mở rộng biến bị vô hiệu hóa hoặc $TESTđã có một giá trị phù hợp. Nếu bạn muốn gán hellocho biến TESTthì bạn phải nói TEST=hello(lưu ý: không $).

Sau đó tôi xuất nó và thử lại echonó trong một cửa sổ terminal khác. kết quả vẫn như trước.

Một lần nữa, đây là kết quả mong đợi.

nhưng nếu tôi thực thi cùng một mã khi đăng nhập (nối thêm mã vào ~/.profiletệp) thì có thể sử dụng bất kỳ cửa sổ đầu cuối nào.

Điều này là do shell trong thiết bị đầu cuối là hậu duệ của vỏ đọc các cài đặt môi trường từ ~/.profileđó và do đó được thừa hưởng các cài đặt này.

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.