/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 ~/.bashrc
hoặ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 bash
và dash
) 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/profile
gọi chúng. Ví dụ: trên hệ thống Ubuntu 12.04 của tôi, /etc/profile
bao 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_profile
hoặc .bash_login
trong 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_profile
tồn tại, bash
chạy nó thay vì .profile
. Nếu .bash_profile
không tồn tại nhưng .bash_login
tồn tại, đó là chạy thay vì .profile
.
(Nhưng thông thường , .bash_profile
hoặc .bash_login
khi 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_login
nhưng nếu tôi sử dụng nó .profile
và sau đó đăng nhập bằng dash
vỏ 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ì:
- 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
- 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 bash
nhưng giữ môi trường của mình (vì vậy chạy bash
lại trong khi ở trong zsh
), và sau đó chạy một chương trình như mc
vậy chạy shell như một phần giao diện của nó. Nếu bin
tồn tại trong thư mục nhà của bạn và tên người dùng james
của bạn, PATH
thì 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
- 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
- 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 bash
là 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ả 1 và 2 đề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 bash
ngay 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 bash
và 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.bashrc
hoặc~/.bashrc
. Điều này là do, theo mặc định, /etc/profile
và ~/.profile
chạ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/profile
các nguồn /etc/bash.bashrc
cho bash
.)
Do đó, cả tệp "hồ sơ" và "RC" đều chạy khi bạn khởi động trình bash
vỏ 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 -l
cờ (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 -i
cho root
(sử dụng sudo -s
cho 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 - username
cho root
ngườ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 sinh là shell đă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 OpenBSD là
ksh
; trong Ubuntu, nó bash
."
- "Bạn có thể thay đổi vỏ đăng nhập của mình với
chsh
."
Đọc thêm