TL; DR
Các tệp cấu hình này cho dù toàn cầu ( /etc/environment
, /etc/profile
) hoặc dành riêng cho người dùng ( ~/.profile
, ~/.bashrc
) chỉ được xử lý vào lần đăng nhập / phiên tiếp theo.
Các tệp toàn cầu áp dụng cho tất cả người dùng (không chỉ root) ... nhưng bạn phải khởi động lại phiên đăng nhập của mình để xem các thay đổi được phản ánh trong môi trường. Điều này có thể xảy ra bằng cách gọi su
khi bạn quan sát ... hoặc bằng cách đăng xuất / đăng nhập hoặc khởi động lại. Bạn có thể su
với một người dùng không phải root và bạn sẽ thấy họ cũng có những thay đổi về môi trường.
Lý do tại sao bạn cần khởi động lại hoặc đăng nhập lại để có được môi trường toàn cầu được chọn là vì môi trường được kế thừa từ các quy trình gốc và quy trình gốc cho mọi thứ khác bạn chạy là trình đăng nhập của bạn ... vì vậy nếu trình đăng nhập của bạn không có môi trường ... sau đó không làm các quá trình bắt đầu trong vỏ đăng nhập. Tất nhiên bạn có thể thiết lập / cập nhật môi trường cho các quy trình riêng lẻ khi bạn khởi động chúng nhưng bạn sẽ phải đặt môi trường cho vỏ đăng nhập và khởi động lại tất cả các quy trình phụ để chúng thấy sự thay đổi.
Môi trường toàn cầu
Khi ai đó đề cập, bạn cần khởi động lại hoặc logout / login để những thay đổi /etc/profile
, /etc/profile.d/*.sh
và /etc/environment
được nhặt.
Điều này là do trong khi các tệp này chỉ định môi trường toàn cầu ... chúng chỉ được chạy một lần khi đăng nhập và vì vậy các thông tin đăng nhập / phiên hiện tại sẽ không phản ánh các thay đổi đối với các tệp đó. Khởi động lại "đặt lại" thông tin đăng nhập của mọi người buộc họ phải chọn môi trường mới.
Trong phiên đăng nhập của riêng bạn, bạn có thể source /etc/profile
chọn các thay đổi mà không cần khởi động lại hoặc đăng xuất / đăng nhập ... nhưng điều đó sẽ chỉ ảnh hưởng đến phiên của chính bạn và các quy trình mới đang chạy trong phiên của bạn.
Cũng lưu ý rằng không có nội suy biến đổi trong /etc/environment
(nó không phải là một tập lệnh) vì vậy bạn không thể làm những thứ như PATH="$PATH:/my/custom/path"
ở đó.
Cũng lưu ý rằng /etc/profile
và /etc/profile.d/*.sh
chỉ được chạy cho các phiên đăng nhập và do đó môi trường được định cấu hình sẽ không có sẵn cho các tài khoản không đăng nhập hệ thống (nghĩa là nếu bạn đang cố gắng đặt biến môi trường cho quy trình trình nền chạy bên ngoài vỏ đăng nhập của mình).
Lưu ý rằng bashrc
không phải là hữu ích cho việc thiết lập môi trường cho toàn bộ vỏ đăng nhập nhưng đối với vỏ bash và các quá trình phụ ... như vậy cho đúng "toàn cầu" hoặc "người dùng toàn cầu" có thể bạn muốn đặt cấu hình môi trường của bạn trong /etc/profile
hoặc /etc/profile.d/my-custom-env.sh
hoặc ~/.profile
. Các shell khác (ví dụ zsh) cũng có các tệp cấu hình riêng, do đó, cấu hình môi trường không dành riêng cho bash trong bashrc sẽ gây ra sự cố hoặc nhầm lẫn nếu / khi bạn chuyển đổi shell (hoặc có người dùng khác trên hệ thống sử dụng các shell khác nhau).
Đây là một vấn đề phổ biến để cài đặt một chương trình mới và cần chỉ định một số môi trường để nó chạy đúng. Môi trường toàn cầu là một câu trả lời, nhưng thường sẽ yêu cầu khởi động lại không lý tưởng cho các máy chủ và tự động cung cấp / định cấu hình các trường hợp sử dụng. Bạn nên tự hỏi liệu đây có thực sự là một biến mà tất cả người dùng và chương trình trên hệ thống cần hoặc nếu nó thực sự chỉ là thứ bạn cần để cung cấp cho một người dùng hoặc chương trình cụ thể.
Đối với người dùng cụ thể
xem xét bao gồm môi trường trong hồ sơ hoặc bashrc trong thư mục nhà của người dùng (ví dụ ~/.profile
~/.bashrc
) tùy thuộc vào việc bạn muốn điều này để tương tác, shell đăng nhập, chỉ bash, v.v.
Hãy nhớ rằng điều này cũng yêu cầu khởi động lại hoặc đăng xuất / đăng nhập để thay đổi môi trường có sẵn cho tất cả các quy trình trong phiên đăng nhập của người dùng. Người dùng có thể source ~/.profile
... nhưng điều đó được thực hiện trong một thiết bị đầu cuối và chỉ cập nhật môi trường trong phiên thiết bị đầu cuối đó và các quy trình con ... không nhất thiết cho toàn bộ môi trường đăng nhập của người dùng.
Đối với một chương trình cụ thể có một vài lựa chọn.
Một là chỉ cung cấp môi trường khi chạy lệnh:
VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE" /path/to/program --opt1 --op2
Nếu bạn đang sử dụng systemd bạn cũng có thể xác định môi trường trong file đơn vị / dịch vụ theo [Service]
vớiEnvironment=VAR_NAME="VAR VALUE" VAR2_NAME="VAR2_VALUE
Tùy chọn này có thể gây cảm giác khó chịu vì bạn phải chỉ định môi trường mỗi khi bạn chạy chương trình, nhưng nếu môi trường thực sự chỉ cần chương trình đó ... thì đây thực sự là cách tốt nhất và bạn nên làm quen với nó và không đổ mọi thứ vào một tập tin bashrc hoặc hồ sơ.
Nếu bạn không sử dụng systemd hoặc init để thiết lập môi trường và chạy chương trình ... thì tất nhiên bạn cũng có thể chỉ thực hiện chương trình thực thi chương trình bash trong đó bạn lưu toàn bộ lệnh bao gồm thiết lập môi trường để thuận tiện.
Người giới thiệu:
Ngoài ra còn có một câu trả lời rất chi tiết ở đây mà tôi khuyên bạn nên đọc: https://askubfox.com/a/247769/824160