Điểm:5

Máy tính để bàn Ubuntu: Tại sao tập lệnh .profile được thực thi trong trình bao không đăng nhập tương tác?

lá cờ kz

Tôi hiểu về sự khác biệt giữa đăng nhập tương tácTương tác không đăng nhập

Theo bài viết xuất sắc này: Thứ tự tải tệp khởi động Zsh/Bash (.bashrc, .zshrc, v.v.) chúng ta có bảng sau

+-----------------+------+----------+------+
| |Tương tác|Tương tác|Tập lệnh|
| |đăng nhập |không đăng nhập | |
+-----------------+------+----------+------+
|/etc/hồ sơ | Một | | |
+-----------------+------+----------+------+
|/etc/bash.bashrc| | Một | |
+-----------------+------+----------+------+
|~/.bashrc | | B | |
+-----------------+------+----------+------+
|~/.bash_profile | B1 | | |
+-----------------+------+----------+------+
|~/.bash_login | B2 | | |
+-----------------+------+----------+------+
|~/.hồ sơ | B3 | | |
+-----------------+------+----------+------+
|BASH_ENV | | | Một |
+-----------------+------+----------+------+
| | | | |
+-----------------+------+----------+------+
| | | | |
+-----------------+------+----------+------+
|~/.bash_logout | C | | |
+-----------------+------+----------+------+

Liên kết đầu tiên đề cập đến bài đăng xuất sắc khác này: Dọn dẹp các tùy chỉnh bash nơi có sẵn một lời giải thích tuyệt vời về đăng nhập tương tácTương tác không đăng nhập như sau:

Một đăng nhập tương tác shell là shell mà bạn đang nhập vào, đó là shell đầu tiên bạn thực thi trên máy. Thông thường, bạn sẽ phải đăng nhập ngay trước khi shell bắt đầu. Ví dụ: khi bạn SSH vào một hệ thống từ xa và nhập lệnh cho hệ thống đó, bạn đang nhập vào trình bao đăng nhập tương tác.

Một vỏ không đăng nhập tương tác shell mới có bắt đầu sau khi bạn đã đăng nhập hay không; một ứng dụng không yêu cầu bạn phải đăng nhập lại. Ví dụ, nếu bạn mở một cửa sổ đầu cuối mới trong giao diện người dùng đồ họa của mình và nhận được dấu nhắc trình bao, đó là trình bao tương tác không đăng nhập. Một ví dụ khác về trình bao tương tác không đăng nhập sẽ là một trình bao phụ bắt đầu từ bên trong trình soạn thảo văn bản; ví dụ, gõ :sh trong vi.

Về cái trước, nó thực tế được áp dụng bắt buộc trong Ubuntu Người phục vụ môi trường - nơi làm việc với từng tty là nó cần đăng nhập, vì vậy theo bảng ~/.profile được sử dụng (tôi xác nhận không tồn tại cả ~/.bash_profile cũng không ~/.bash_login các tập tin). Nó áp dụng cho su - người dùng khác (nó yêu cầu mật khẩu của anh ấy/cô ấy) và do đó mật khẩu của chính anh ấy/cô ấy ~/.profile tập tin cũng được thực thi. Cho đến đây tôi vẫn ổn.

Về cái sau - lý do của bài đăng này - Ubuntu máy tính để bàn môi trường, nó áp dụng khi một cửa sổ/thiết bị đầu cuối mới được mở chỉ bằng một tab theo mặc định, do đó, theo bảng nên được thực thi /etc/bash.bashrc~/.bashrc tập tin và không phải các .Hồ sơ tập tin

Nhưng mà tại sao nếu được thực hiện trong điều đó phần cuối:

  • tiếng vang $Java_HOME (được xác định trên .Hồ sơ)
  • tiếng vang $M2_HOME (được xác định trên .Hồ sơ)
  • tiếng vang $GRADLE_HOME (được xác định trên .Hồ sơ)
  • java nào
  • mvn nào
  • lớp nào

tất cả các lệnh hoạt động bình thường?

Hành vi tương tự cho bất kỳ tab mới nào (Ctrl + Shift + T) trong cùng một Cửa sổ ngay cả đối với Cửa sổ đầu cuối mới với lại tab mặc định duy nhất của nó

Tôi đọc bài viết sau:

Và tôi không có cài đặt nào được đề cập (cài đặt thứ hai được điều chỉnh cho Ubuntu Desktop 18:04):

  • Các .bashrc các tệp không đề cập hoặc tìm nguồn cung ứng .Hồ sơ tập tin
  • Chỉnh sửa --> Sở thích --> không tên -> tab lệnh --> Chạy lệnh dưới dạng vỏ đăng nhập (nó không được chọn)
raj avatar
lá cờ cn
raj
Không phải trình bao đang thực thi tệp `.profile`. Cố gắng chèn một lệnh như `echo Đây là .profile` vào tệp `.profile` - bạn sẽ không thấy thông báo trên bất kỳ thiết bị đầu cuối mới nào mà bạn mở và bạn **nên** thấy nó nếu shell thực sự đang thực thi tập tin. Chính **môi trường máy tính để bàn** (Gnome hoặc loại khác) của bạn sẽ thực thi tệp này khi khởi động phiên. Các biến môi trường được xác định ở đó sau đó được kế thừa (như đã nói trong câu trả lời bên dưới) bởi **tất cả các quy trình** bắt đầu từ môi trường máy tính để bàn, **bao gồm cả thiết bị đầu cuối**.
Manuel Jordan avatar
lá cờ kz
@raj Logic đó có phá vỡ/vi phạm các quy tắc được chỉ ra trong (các) bảng được chia sẻ trong hai liên kết trong câu hỏi của tôi không? Thoạt nhìn có vẻ đúng - hành vi đó xảy ra trong các bản phân phối Linux khác?
raj avatar
lá cờ cn
raj
Không nó không. Logic đề cập đến **thực thi các tệp khởi động bằng trình bao**. Tệp `~/.profile` **không được trình bao thực thi** trong trường hợp này. Vì vậy, mọi thứ đều ổn. Ở trên không nói gì về việc thực thi tệp bằng phần mềm **khác** ngoài trình bao. Ngoài ra, như đã nói trong nhận xét đầu tiên cho câu trả lời, điều quan trọng là tệp phải được DE thực thi khi đăng nhập, vì nếu không, điều tồi tệ sẽ xảy ra trong các thiết bị đầu cuối bắt đầu từ DE (ví dụ: bạn sẽ không có `$PATH` được xác định chính xác, vì vậy một số lệnh hoạt động khi bạn đăng nhập qua ssh sẽ không hoạt động từ DE).
Điểm:8
lá cờ cn

Các tập lệnh được thực thi cho một vỏ đăng nhập (toàn hệ thống /etc/hồ sơ, bất kỳ tập lệnh nào trong /etc/profile.d, địa phương của bạn ~/.profile và các tệp khác mà bạn liệt kê) xác định môi trường của người dùng hiện tại của bạn - kể từ khi bạn đăng nhập.

Không tí nào không đăng nhập shell mà bạn mở sau đó, ít nhất sẽ kế thừa môi trường của shell đăng nhập của bạn. Đó là lý do tại sao bạn (đã) có tất cả các biến môi trường được xác định trong .Hồ sơ khi bạn mở một thiết bị đầu cuối mới.

lá cờ cc
Chính xác, kế thừa là chìa khóa. Thật không may, nhiều thập kỷ trước, những người sử dụng CDE (Môi trường máy tính để bàn chung) đã không nhận được bản ghi nhớ và các thiết bị đầu cuối xuất hiện từ máy tính để bàn của họ (và vấn đề tương tự ngày nay đối với nhiều DE) không bao giờ nhận được môi trường của bạn vì 1) không phải là cụm từ đăng nhập và 2 ) rẽ nhánh từ quy trình không phải của bạn, vì vậy tính kế thừa không hoạt động. Kết quả là có quá nhiều thứ tào lao được đổ vào .bashrc. Thật kinh khủng vì công cụ đó được thực hiện mọi lệnh (chạy set -xv và xem những gì bash thực sự phải thực thi)
Manuel Jordan avatar
lá cờ kz
@vanadium Ngay cả khi câu trả lời của bạn là đúng - logic đó có phá vỡ/vi phạm các quy tắc được chỉ định trong (các) bảng được chia sẻ trong hai liên kết trong câu hỏi của tôi không? Thoạt nhìn có vẻ đúng - hành vi đó xảy ra trong các bản phân phối Linux khác?
vanadium avatar
lá cờ cn
Theo lưu đồ, các tệp loại `profile` được thực thi khi đăng nhập, cho dù bạn đăng nhập trên TTY (Shell đăng nhập tương tác) hay trong môi trường máy tính để bàn (Shell đăng nhập không tương tác). Ngoài ra, .bashrc cũng được chạy vì nó có nguồn gốc từ hồ sơ. Sau khi đăng nhập, khi bạn mở một thiết bị đầu cuối mới hoặc một lớp con (ví dụ: trong TTY) (các lớp vỏ không đăng nhập tương tác), chỉ các tệp kiểu bashrc mới được chạy.
raj avatar
lá cờ cn
raj
@vanadium Trên thực tế, dựa trên nhật ký trong `/var/log/syslog` liên quan đến khởi động phiên Gnome, bạn có thể biết các tệp `/etc/profile` và `~/.profile` đó (nhưng **không** `.bash_profile` ` cũng như `.bash_login`) đều có nguồn gốc rõ ràng từ tập lệnh `/etc/gdm3/Xsession` được điều hành bởi `gdm-x-session` được bắt đầu trực tiếp bởi gdm. Sau đó, `dbus-update-activation-environment` được gọi bởi `gdm-x-session` để xuất môi trường sang các quy trình khác trong phiên (bắt đầu riêng bởi systemd) qua D-Bus. Vì vậy, điều này khá phức tạp, nhưng không có trình bao đăng nhập nào liên quan ở bất kỳ đâu.
vanadium avatar
lá cờ cn
@ray vâng, các chi tiết cụ thể thực sự có thể phức tạp hơn nhiều. Câu hỏi ở đây là "tại sao .profile được thực thi trong trình bao không đăng nhập" - câu trả lời đơn giản là - "không, nó *không* đang được thực thi. Tuy nhiên, nó đã được thực thi trước đó nên bạn kế thừa cài đặt của nó trong trường hợp không đăng nhập của mình vỏ." .

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.