Đặt biến môi trường toàn cầu cho mọi người


17

Nếu tôi đặt một biến trong /etc/environment, nó dường như chỉ áp dụng cho quản trị viên khi ở trong sudo su.

Làm thế nào tôi có thể nhận được các biến để áp dụng cho tất cả mọi người? Đặc biệt là khi họ đang ở trong thiết bị đầu cuối? Làm các thiết lập trong /etc/enviromentkhông áp dụng cho bash?

Câu trả lời:


13

Bản /etc/environmentcập nhật sẽ chỉ hoạt động trong phiên tiếp theo, nó không tự động tải lại.

Điều đó có nghĩa là bạn không thể thay đổi nó cho các phiên đã bắt đầu cho người dùng khác.

Nếu bạn muốn "tải lại" bất cứ thứ gì trong lệnh /etc/environmentbạn cần có lệnh sau:

source /etc/environment

Nhưng một lần nữa, nó sẽ chỉ hoạt động cho phiên hiện tại của riêng bạn, những người dùng khác sẽ không bị ảnh hưởng cho đến khi họ bắt đầu một phiên mới hoặc chạy lệnh trên trong phiên của riêng họ.


4

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 sukhi 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ể suvớ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/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/profilechọ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/etc/profile.d/*.shchỉ đượ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 bashrckhô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/profilehoặc /etc/profile.d/my-custom-env.shhoặ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


3

tạo một tập lệnh shell tùy chỉnh bên dưới

/etc/profile.d/

thêm các biến môi trường toàn cầu của bạn bên trong tập lệnh đã tạo, khởi động lại máy sau đó nó sẽ có sẵn cho mọi người.


Tôi tin rằng đây là một cách tiếp cận đáng tin cậy hơn là chỉnh sửa tệp / etc / môi trường vì tệp đó có thể được thay đổi khi các gói được cập nhật.
phreed 12/2/19

2

Thêm một biến để /etc/environmentlàm việc cho tôi.

Tuy nhiên tôi đã phải khởi động lại sau khi thay đổi /etc/environmentđể thay đổi có hiệu lực. Đơn giản chỉ cần đóng và mở lại cửa sổ terminal là không đủ.


3
Bạn luôn có thể làm một source /etc/environmentđể tải lại nó.
Panthro

Đăng xuất và trở lại trong nên đủ.
Karuhanga
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.