Tại sao tôi phải `nguồn .profile` trong mỗi thiết bị đầu cuối tôi mở?


10

Khi chúng ta thay đổi một số biến ~/.profiletrong Ubuntu, thì chúng ta sẽ thực thi lệnh source .profile. Sau đó, sự thay đổi chỉ có hiệu lực trong thiết bị đầu cuối này. Nếu chúng ta mở một thiết bị đầu cuối mới, chúng ta phải thực hiện lại lệnh source .profile. Vì vậy, có vẻ như các thiết bị đầu cuối khác nhau có môi trường riêng của chúng mặc dù chúng có thể thuộc về cùng một người dùng.

Lợi thế của việc làm cho mỗi thiết bị đầu cuối có đường dẫn môi trường riêng là gì? Có vẻ như sẽ tốt hơn nếu các thiết bị đầu cuối khác nhau thuộc về cùng một người dùng chia sẻ cùng một biến môi trường.



Nếu "shell" đăng nhập của bạn là GUI, điều đó không giúp ích nhiều cho việc đặt var trong tập lệnh đăng nhập của sh thay vì GUI của bạn.
ikegami

Câu trả lời:


14

Lý do cho điều này ~/.profilelà chỉ có nguồn gốc bởi vỏ đăng nhập. Khi bạn mở một cửa sổ terminal mới, shell bắt đầu là shell không đăng nhập theo mặc định. Nếu bạn đăng xuất và đăng nhập lại, thay đổi ~/.profilesẽ có hiệu lực trong tất cả các thiết bị đầu cuối của bạn, bởi vì ~/.profilecó nguồn gốc khi bạn đăng nhập vào phiên của mình.

Đây không phải là trường hợp các cửa sổ đầu cuối khác nhau có môi trường khác nhau, nhưng nguồn đó ~/.profilechỉ thực hiện ~/.profiletrong trình bao hiện tại (đó chính xác là những gì sourcelệnh thực hiện).

Ngược lại, một thay đổi ~/.bashrcsẽ ngay lập tức ảnh hưởng đến bất kỳ cửa sổ terminal mới nào bạn mở hoặc bất kỳ shell Bash nào bạn bắt đầu bằng cách nhập bash, bởi vì nó được lấy từ tất cả các shell Bash tương tác.


3

Biến môi trường không chỉ dành cho sở thích của người dùng. Chúng là một cơ chế chung để truyền đạt nhiều thông tin cài đặt từ quy trình cha mẹ sang quy trình con mà nó bắt đầu.

Có rất nhiều trường hợp trong đó một quy trình sẽ đặt các biến môi trường cụ thể để chỉ ảnh hưởng đến các quy trình mà nó bắt đầu. Ví dụ: tập lệnh có thể cố tình đặt lại cài đặt ngôn ngữ cho các lệnh mà nó khởi động, để nó có thể phân tích đầu ra từ chúng. Các tập lệnh xây dựng cho nhiều gói phần mềm lớn sử dụng các yêu cầu lồng nhau makephối hợp với nhau thông qua các biến môi trường. Các công cụ chuyên dụng có thể cần thay đổi điều kiện làm việc của các chương trình khác mà chúng bắt đầu bằng cách thực hiện các thủ thuật với $ LD_PRELOAD hoặc $ PATH.

Nếu một cái gì đó mà người dùng làm trong một cửa sổ khác trong khi một trình biên dịch dài đang chạy trong một cửa sổ khác sẽ chỉ thay đổi một cách kỳ diệu các biến môi trường của tất cả các quá trình của anh ta sau lưng, sự điên rồ và hỗn loạn sẽ xảy ra.

Các biến môi trường khác chứa thông tin về phiên cụ thể mà một quy trình được bắt đầu. Các chương trình mong đợi $ TERM để mô tả tập lệnh của thiết bị đầu cuối cụ thể (hoặc trình giả lập thiết bị đầu cuối) mà chúng được kết nối; làm cho một cài đặt chung cho mỗi người dùng sẽ khiến không thể đăng nhập vào cùng một hệ thống với một số loại thiết bị đầu cuối khác nhau. Ngay cả khi bạn chỉ có một phần cứng thiết bị đầu cuối và không bao giờ đăng nhập từ xa, các chương trình như screenphụ thuộc vào việc đặt $ TERM khác nhau cho các quy trình chạy bên trong phiên của chúng.

Một câu hỏi tốt hơn là, tại sao chúng ta sử dụng cơ chế giao tiếp giữa quá trình với quy trình con cho các cài đặt tùy chọn người dùng, thay vì cơ sở dữ liệu theo người dùng?

Câu trả lời: Bởi vì nó hoạt động tốt đủ và những lợi ích của thực hiện một cơ sở dữ liệu cho mỗi người dùng không đủ lớn mà công việc của thay đổi tất cả mọi thứ để sử dụng thay vì biến môi trường sẽ được thực hiện.

(Tôi có thể nghĩ rất ít cài đặt ưu tiên nơi có sẽ không có một số trường hợp sử dụng nơi nó thuận tiện để thay đổi chúng chỉ để thực hiện một kịch bản duy nhất, chẳng hạn. Vì vậy, để không làm chức năng mất, mọi thứ vẫn sẽ cần phải được overridable bởi biến môi trường, dẫn đến sự phức tạp thêm và người dùng bối rối hơn).

Nó không phải như thể thay thế không tồn tại . Ví dụ: tài nguyên X là trên mỗi phiên hiển thị thay vì mỗi quy trình. Nhưng chúng rất khó truy cập cho các chương trình dòng lệnh - và các chương trình dòng lệnh thường cần phải hoạt động cho các thông tin đăng nhập từ xa thậm chí không máy chủ X để kết nối.

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.