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à export
ed. 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 hello
cho biến TEST
thì bạn phải nói TEST=hello
(lưu ý: không $
).
Sau đó tôi xuất nó và thử lại echo
nó 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 ~/.profile
tệ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.