Tại sao / etc / profile không được gọi cho shell không đăng nhập?


51

Shell đăng nhập và không đăng nhập được định nghĩa là:

su - $USER # will give you a login shell
bash # will give you a non-login shell

/ etc / profile không được gọi cho shell không đăng nhập, chẳng hạn như khi bạn bắt đầu konsole (kde). / etc / profile chỉ được gọi cho shell đăng nhập.

Tại sao vậy? Xin giải thích, vì tôi thích hiểu lý do của việc này.

Câu trả lời:


100

/etc/profile chỉ được gọi cho shell đăng nhập vì đó là mục đích cụ thể của nó.

Nếu bạn muốn một lệnh chạy cho các shell tương tác không phải là shell đăng nhập và bạn đang sử dụng bash, hãy đặt nó vào ~/.bashrchoặc /etc/bash.bashrc.

Mục đích của các tệp "hồ sơ" là chứa các lệnh chỉ nên chạy cho shell đăng nhập. Những tập tin này là:

  • /etc/profile, được điều hành bởi tất cả các shell tương thích Bourne (bao gồm bashdash) khi được bắt đầu như một shell đăng nhập.

  • Kịch bản trong /etc/profile.d.

    Cái này dành cho shell kiểu Bourne, nhưng nó không được mã hóa thành shell thực thi. Thay vào đó, các lệnh trong /etc/profilegọi chúng. Ví dụ: trên hệ thống Ubuntu 12.04 của tôi, /etc/profilebao gồm các dòng sau:

    if [ -d /etc/profile.d ]; then
      for i in /etc/profile.d/*.sh; do
        if [ -r $i ]; then
          . $i
        fi
      done
      unset i
    fi
    
  • .profile trong thư mục nhà của người dùng, được chạy bởi các shell tương thích Bourne khi được khởi động như một shell đăng nhập (trừ khi bị ghi đè, xem bên dưới).

  • .bash_profilehoặc .bash_logintrong thư mục nhà của người dùng. Chúng được bỏ qua bởi các vỏ khác bash. Nhưng nếu .bash_profiletồn tại, bashchạy nó thay vì .profile . Nếu .bash_profilekhông tồn tại nhưng .bash_logintồn tại, đó là chạy thay vì .profile.

    (Nhưng thông thường , .bash_profilehoặc .bash_loginkhi nó tồn tại, được viết để * gọi một cách rõ ràng .profile.)

    Lợi ích của các tệp hồ sơ dành riêng cho hệ vỏ là chúng có thể chứa các lệnh hoặc cú pháp chỉ hợp lệ cho trình bao đó. Ví dụ: tôi có thể sử dụng [[toán tử đánh giá trong .bash_profile/ .bash_loginnhưng nếu tôi sử dụng nó .profilevà sau đó đăng nhập bằng dashvỏ của mình, nó sẽ thất bại.

Những gì nên đi trong tập tin "hồ sơ"

Các tập tin "hồ sơ" nên chứa các lệnh chỉ nên chạy một lần, khi bắt đầu đăng nhập. . hoặc bắt đầu, v.v.) đó là một vỏ đăng nhập.

Bạn có thể muốn chạy lệnh chỉ một lần vì:

  1. không có lý do để chạy nó nhiều hơn một lần cho mỗi lần đăng nhập, nó sẽ không hiệu quả, hoặc
  2. nó sẽ tạo ra một kết quả không mong muốn, để chạy nó nhiều hơn một lần cho mỗi lần đăng nhập.

Như một ví dụ về tình huống thứ hai, trong đó một kết quả không mong muốn sẽ xảy ra, hãy xem xét các dòng này, xuất hiện theo mặc định trong mỗi người dùng ~/.profile:

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi

Giả sử bạn SSH, đã chạy shell khác (giả sử zsh), tại một số điểm bạn thấy bạn muốn tạm thời quay lại bashnhưng giữ môi trường của mình (vì vậy chạy bashlại trong khi ở trong zsh), và sau đó chạy một chương trình như mcvậy chạy shell như một phần giao diện của nó. Nếu bintồn tại trong thư mục nhà của bạn và tên người dùng jamescủa bạn, PATHthì trong vỏ trong cùng của bạn là một cái gì đó như:

/home/james/bin:/home/james/bin:/home/james/bin:/home/james/bin:/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

Điều đó không hiệu quả và (quan trọng hơn nhiều) làm cho khó hiểu nội dung của PATH.

Điều này không có nghĩa là một thảm họa, mặc dù. Theo như tôi có thể nói, nếu mọi tệp "hồ sơ" có vỏ tương tác, sẽ không có gì khủng khiếp xảy ra, trong cấu hình mặc định . Tuy nhiên, vì mục đích của các tệp "hồ sơ" là chứa các lệnh chỉ chạy một lần mỗi lần đăng nhập , người dùng hoặc quản trị viên có thể thêm các lệnh vào hồ sơ chỉ phải chạy khi bắt đầu trình bao đăng nhập.

Nơi đặt lệnh cho mỗi Shell tương tác để chạy

Nếu bạn đang sử dụng bash, có các tệp cho các lệnh sẽ được chạy trong mọi shell tương tác:

  • /etc/bash.bashrc
  • .bashrc trong thư mục nhà của người dùng.

Điều này thường được sử dụng cho các lệnh

  1. chỉ ảnh hưởng đến môi trường của vỏ mà chúng chạy - thậm chí không phải vỏ con, hoặc
  2. nên chạy ngay cả khi đây không phải là vỏ đăng nhập.

Ví dụ, thường hoàn thành tab dòng lệnh nên được kích hoạt cho dù đó có phải bashlà vỏ đăng nhập hay không . Vì vậy, điều này xuất hiện trong ~/.bashrc:

if [ -f /etc/bash_completion ] && ! shopt -oq posix; then
    . /etc/bash_completion
fi

Ở đó, cả 12 đều áp dụng: điều này không mang đến các shell khác chạy bên trong lớp vỏ này và việc hoàn thành tab sẽ hoạt động bashngay cả khi tôi đăng nhập bằng một shell khác.

Nơi đặt lệnh cho Shell đăng nhập và Shell không đăng nhập tương tác

Nếu bạn đang sử dụng bashvà muốn một lệnh chạy trong shell đăng nhập và shell tương tác và đó không phải là shell đăng nhập, thì nói chung là đủ để đặt nó vào /etc/bash.bashrchoặc~/.bashrc . Điều này là do, theo mặc định, /etc/profile~/.profilechạy chúng rõ ràng. Ví dụ ~/.profile: có:

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f "$HOME/.bashrc" ]; then
        . "$HOME/.bashrc"
    fi
fi

(Tương tự, /etc/profilecác nguồn /etc/bash.bashrccho bash.)

Do đó, cả tệp "hồ sơ" và "RC" đều chạy khi bạn khởi động trình bashvỏ tương tác (có hay không đó là trình đăng nhập).

Nơi đặt các lệnh để chạy trong Shell không tương tác

Bạn có thể không muốn chỉ định bất kỳ lệnh nào cho tất cả các shell không tương tác để chạy; chúng sẽ chạy mỗi khi tập lệnh được chạy (với điều kiện tập lệnh được chạy bởi trình bao bạn định cấu hình để chạy chúng).

Điều này có thể gây ra vỡ đáng kể. Nếu bạn định làm điều này và không có tài khoản quản trị viên trên hệ thống ngoài tài khoản bạn đang sử dụng, bạn có thể muốn tạo một tài khoản; Điều đó có thể làm cho nó dễ dàng hơn để sửa chữa sai lầm.

Trong bash, các tập tin "RC" thực sự chạy dù vỏ có tương tác hay không . Tuy nhiên, ở đầu họ nói:

# If not running interactively, don't do anything
[ -z "$PS1" ] && return

Vì vậy, nếu bạn cần các lệnh để chạy tự động ngay cả trong các shell không tương tác như các lệnh chạy để thực thi các tập lệnh, bạn có thể thêm các lệnh của mình trước các dòng đó.

Bắt đầu một Shell đăng nhập

Đăng nhập bắt đầu một vỏ đăng nhập. Nếu bạn muốn một shell bắt đầu sau đó hoạt động như một shell đăng nhập, hãy khởi động nó với -lcờ (viết tắt của l ogin ). Ví dụ:

Đó là cách tốt nhất để bắt đầu một vỏ đăng nhập (không cần đăng nhập) trừ khi bạn muốn bắt đầu một người dùng khác . Sau đó sử dụng:

  • sudo -icho root(sử dụng sudo -scho shell gốc không đăng nhập, tương tác)
  • sudo -u username -i cho bất kỳ người dùng nào
  • su - usernamecho rootngười dùng không sử dụng (sử dụng cho vỏ gốc không tương tác, không đăng nhập)su username

Một là những gì ban đầu vỏ đăng nhập?

Một vỏ đăng nhập ban đầu giống như một vỏ đăng nhập . Ở mọi nơi câu trả lời này đều nói "shell đăng nhập", nó có thể nói "shell đăng nhập inital" (ngoại trừ trong phần này, điều này đã dừng lại có ý nghĩa).

Một lý do cho thuật ngữ shell đăng nhập bẩm sinhshell đăng nhập cũng được sử dụng theo một nghĩa khác - để xác định chương trình nào được sử dụng làm shell được thực thi bằng cách đăng nhập. Đây là ý nghĩa của vỏ đăng nhập được sử dụng để nói:

  • " Vỏ đăng nhập mặc định của OpenBSDksh; trong Ubuntu, nó bash."
  • "Bạn có thể thay đổi vỏ đăng nhập của mình với chsh."

Đọc thêm


4
Một trong những câu trả lời tốt nhất cho bất kỳ câu hỏi nào trên bất kỳ trang web Stack Exchange nào.
Đánh dấu E. Haase

1
> Tập tin "hồ sơ" nên chứa các lệnh chỉ nên chạy một lần, khi bắt đầu đăng nhập. (Điều này bao gồm cả thông tin đăng nhập đồ họa, vì chúng cũng bắt đầu bằng vỏ đăng nhập.) Không không không không không! Nó hoàn toàn không! Tất cả các shell giống như bourne chỉ đọc .profile trong các phiên shell đăng nhập tương tác , tức là các shell được bắt đầu bằng tùy chọn -i hoặc các shell được kết nối với thiết bị đầu cuối điều khiển (cả hai đều không đúng nếu shell được khởi động bởi trình quản lý hiển thị). Lý do điều này đúng là vì mục đích của tệp này là để thiết lập thiết bị đầu cuối của người dùng , không chỉ môi trường của họ. Nếu người quản lý hiển thị tr

Eliah, tôi đã sao chép phần còn lại của bình luận của Derek ở đây nhưng đã để lại gốc cây ở trên để anh ta nhận được thông báo trả lời của bạn, mặc dù anh ta sẽ không thể trả lời vì yêu cầu về danh tiếng. Tuy nhiên, tôi đã cho anh ta quyền truy cập vào phòng chat trên.
Seth

1
In bash, the "rc" files are actually run whether the shell is interactive or not. không chính xác /etc/bash.bashrc được kích hoạt bởi /etc/bash.profile.
okwap

okwap là đúng, các tập tin RC không được gọi trong shell không tương tác, điều này là ngắn gọn và chính xác hơn.
Nick Allen
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.