关于.bash_*的执行顺序

这一篇介绍了下面这些文件的执行顺序:

  • /etc/profile
  • ~/.bash_profile
  • ~/.bashrc
  • ~/.bash_login
  • ~/.profile
  • ~/.bash_logout

交互式shell的执行顺序

  1. execute /etc/profile
  2. IF ~/.bash_profile exists THEN
  3. execute ~/.bash_profile
  4. ELSE
  5. IF ~/.bash_login exist THEN
  6. execute ~/.bash_login
  7. ELSE
  8. IF ~/.profile exist THEN
  9. execute ~/.profile
  10. END IF
  11. END IF
  12. END IF

登出时:

  1. IF ~/.bash_logout exists THEN
  2. execute ~/.bash_logout
  3. END IF

需要注意的是/etc/bashrc是由~/.bashrc执行的:

  1. # cat ~/.bashrc
  2. if [ -f /etc/bashrc ]; then
  3. . /etc/bashrc
  4. fi

non-login shell的顺序

科普 nologin shell


当我们需要一个不允许登陆但是允许使用系统资源的用户时,就用到了nologin shell(/usr/sbin/nologin), 比如在 /etc/passwd中的各种系统账户,当登陆的shell为nologin shell 时,会提示你此账户不允许登陆,而/bin/false则是连登陆都不让登陆,只会返回False。 具体请看 :whats-the-difference-between-sbin-nologin-and-bin-false


  1. IF ~/.bashrc exists THEN
  2. execute ~/.bashrc
  3. END IF

测试.

作者在这里做了个小测试, 就是在不同的文件下写了一个PS1, 看看哪个被覆盖, 其实这样做很啰嗦的, 不如在每个文件下输出一点特殊的东西, 输出什么呢? 就输出自己的文件名, 在~/.bashrc里面就加一句"echo .bashrc >> ~/order", 在~/.bash_login里面就加一句"echo bash_login >> ~/order", 以此类推, 最后只要看看~/order里面是什么就好了.

好麻烦的… 你感兴趣的话自己做吧, 我就不演示了哈~