Bài viết này sẽ giải thích trình tự thực thi các file sau:
- /etc/profile
- ~/.bash_profile
- ~/.bashrc
- ~/.bash_login
- ~/.profile
- ~/.bash_logout
Trình Tự Thực Thi Cho Shell Đăng Nhập Tương Tác
Đoạn mã giả sau giải thích trình tự thực thi các file này.
execute /etc/profile IF ~/.bash_profile exists THEN execute ~/.bash_profile ELSE IF ~/.bash_login exist THEN execute ~/.bash_login ELSE IF ~/.profile exist THEN execute ~/.profile END IF END IF END IF
Khi bạn đăng xuất khỏi shell tương tác, trình tự thực thi sau đây:
IF ~/.bash_logout exists THEN execute ~/.bash_logout END IF
Lưu ý rằng /etc/bashrc được thực thi bởi ~/.bashrc như dưới đây:
# cat ~/.bashrc if [ -f /etc/bashrc ]; then . /etc/bashrc fi
Trình Tự Thực Thi Cho Shell Không Đăng Nhập Tương Tác
Khi khởi chạy một shell tương tác không đăng nhập, trình tự thực thi sau:
IF ~/.bashrc exists THEN execute ~/.bashrc END IF
Lưu ý: Khi một shell không tương tác khởi động, nó tìm biến môi trường ENV và thực thi file có tên được đề cập trong biến ENV.
Kiểm Tra Trình Tự Thực Thi
Một cách để kiểm tra trình tự thực thi là thêm các giá trị PS1 khác nhau vào các file này và đăng nhập lại vào shell để xem giá trị PS1 nào được nhặt bởi dấu nhắc Linux. Chúng ta cũng đã thảo luận về cách dùng PS1 để làm dấu nhắc Linux vừa chức năng vừa đẹp.
1. /etc/profile được thực thi. Thêm dòng PS1 sau vào /etc/profile và đăng nhập lại để đảm bảo dấu nhắc Linux thay đổi thành giá trị PS1 đặt bên trong /etc/profile.
# grep PS1 /etc/profile PS1="/etc/profile> " [Note: re-login to see the prompt change as shown below] Last login: Sat Sep 27 16:43:57 2008 from 192.168.1.2 /etc/profile>
Đảm bảo ~/.bash_profile không có PS1 nào để việc trên hoạt động đúng.
2. ~/.bash_profile được thực thi: Thêm PS1 sau vào ~/.bash_profile, ~/.bash_login, ~/.profile và ~/.bashrc. Đăng nhập lại để đảm bảo dấu nhắc Linux thay đổi thành giá trị PS1 đặt bên trong ~/.bash_profile như dưới đây.
/etc/profile> grep PS1 ~/.bash_profile export PS1="~/.bash_profile> " /etc/profile> grep PS1 ~/.bash_login export PS1="~/.bash_login> " /etc/profile> grep PS1 ~/.profile export PS1="~/.profile> " /etc/profile> grep PS1 ~/.bashrc export PS1="~/.bashrc> " [Note: Upon re-login, it executed /etc/profile first and ~/.bash_profile next. So, it took the PS1 from ~/.bash_profile as shown below. It also did not execute ~/.bash_login, as ~/.bash_profile exists] Last login: Sat Sep 27 16:48:11 2008 from 192.168.1.2 ~/.bash_profile>
3. ~/.bash_login được thực thi. Đổi tên .bash_profile thành tên khác. Đăng nhập lại để đảm bảo dấu nhắc Linux thay đổi thành giá trị PS1 đặt bên trong ~/.bash_login như dưới đây.
~/.bash_profile> mv .bash_profile bash_profile_not_used [Note: Upon re-login, it executed /etc/profile first. Since it cannot find ~/.bash_profile, it executed ~/.bash_login] Last login: Sat Sep 27 16:50:55 2008 from 192.168.1.2 ~/bash_login>
4. ~/.profile được thực thi. Đổi tên .bash_login thành tên khác. Đăng nhập lại để đảm bảo dấu nhắc Linux thay đổi thành giá trị PS1 đặt bên trong ~/.profile như dưới đây.
~/.bash_login> mv .bash_login bash_login_not_used [Note: Upon re-login, it executed /etc/profile first. Since it cannot find ~/.bash_profile and ~/.bash_login, it executed ~/.profile] Last login: Sat Sep 27 16:56:36 2008 from 192.168.1.2 ~/.profile>
5. ~/.bashrc được thực thi cho kiểm tra shell không đăng nhập. Thực thi bash tại dấu nhắc lệnh sẽ cho một shell không đăng nhập khác, sẽ gọi .bashrc như dưới đây.
~/.profile> bash [Note: This displays PS1 from .bashrc as shown below.] ~/.bashrc> exit exit [Note: After exiting from non-login shell, we are back to login shell] ~/.profile>