Điều quan trọng là phải hiểu rằng mỗi quá trình có tập hợp các biến môi trường riêng.
Khi một quy trình gọi cuộc gọi fork()
hệ thống, một quy trình thứ hai ( con ) giống hệt với quy trình đầu tiên ( cha mẹ ) được tạo ra ( bản sao này bao gồm môi trường, nằm ngay bên trên ngăn xếp (hoặc ngay bên dưới, tùy thuộc vào cách bạn nghĩ về ngăn xếp :-)
- nhưng trong unix / linux stack mọc xuống từ địa chỉ cao).
Thông thường, tiến trình con sau đó sẽ gọi cuộc gọi execve()
hệ thống, nó sẽ loại bỏ mọi thứ trong bộ nhớ (ảo) của nó và tái cấu trúc nó từ phần mã và dữ liệu trong tệp nhị phân đã chỉ định.
Tuy nhiên, khi nó xây dựng lại ngăn xếp, nó sao chép môi trường và các chuỗi đối số được truyền execve()
vào ngăn xếp trước (theo thứ tự đó), trước khi gọi main()
hàm (rất nhiều công việc được thực hiện trong crt0
mã bootstrap sau khi execve()
trả về (vào mục nhập điểm quy định trong nhị phân)).
Có các hàm bao cho execve()
cuộc gọi hệ thống trong thư viện C sẽ vượt qua môi trường hiện tại (tức là bản sao của môi trường cha mẹ), thay vì người gọi cung cấp nó (vì vậy, thực tế là đứa trẻ sẽ thừa hưởng môi trường của cha mẹ) - xem environ(7)
.
Hãy thử chạy (với quyền root) lệnh ps axeww | less
... điều này sẽ cho bạn thấy môi trường cho tất cả các quy trình! Một điều thú vị là process id 1 (tức là init
quá trình - quá trình đầu tiên được tạo bởi kernel khi khởi động).
Nếu bạn muốn xem xét môi trường cho một quy trình cụ thể (và bạn biết đó là quy trình id), hãy thử chạy lệnh cat /proc/<PID>/environ
(thay thế <PID>
bằng id quy trình).
Lưu ý rằng nếu một quy trình có đủ đặc quyền, nó có thể viết lại ngăn xếp của chính nó, điều này có thể gây khó khăn cho việc biết môi trường của nó là gì - bạn sẽ thấy một số quy trình daemon như thế này trong đầu ra ps.
Nhưng cuối cùng, tất cả những chiếc bánh quế này đều hiểu rõ những gì @chaos đã nói ở trên, nếu bạn muốn xem giá trị hiện tại của một biến môi trường cụ thể trong quy trình shell của bạn, chỉ cần sử dụng lệnh (dựng sẵn) echo "$<NAME>"
(thay thế <NAME>
bằng tên của biến môi trường mà bạn quan tâm) ... chỉ cần lưu ý rằng cùng một biến có thể có một giá trị khác hoặc hoàn toàn không tồn tại trong một quy trình khác.
echo
là một lựa chọn kém của một lệnh vì nó có thể biến đổi nội dung của biến. Nó sẽ xuất nội dung của tham số shell cùng tên. Đó là không nhất thiết phải giống nhau nếu sử dụng vỏ Bourne hay cho env VAR như1
,*
ví dụ. Và bạn không thể sử dụng phương pháp đó cho các env vars có tên không hợp lệ làm tên biến shell.