login shell:第一次登录进系统时的shell,一般是指本机启动时的控制台shell或者ssh远程登录时的shell。
interactive shell:登录以后,再打开控制台时运行的shell。
none interactive shell:只是用来执行脚本的shell,执行完就结束进程了,没有用户交互过程。
mac有个特殊地方:每次打开一个终端都是一个login shell。
检测当前shell是哪种的方法:
To check if you are in an interactive shell:
[[ $-==*i*]]&& echo 'Interactive'|| echo 'Not interactive'
To check if you are in a login shell:
shopt -q login_shell && echo 'Login shell'|| echo 'Not login shell'
有了这个区分,然后就有了对各种profile/rc文件的执行时机的准则:(通过man bash得知)
1、对于(必然为交互式的)login shell:首先执行 /etc/profile;然后在~/.bash_profile, ~/.bash_login, ~/.profile中查找第一个存在的执行。(对于非交互式shell如果带--login选项也对应此情况)
2、对于交互式非login shell:先后执行 /etc/bash.bashrc 和 ~/.bashrc,注意是都会执行,只要它们存在。(这种默认设置可以用--norc和--rcfile选项来改变)
3、对于非交互式shell:执行环境变量BASH_ENV对应的文件。
结合以上知识,一般的启动脚本配置是:环境变量定义放在.bash_profile里,其它代码放在.bashrc里,然后在.bash_profile里source .bashrc。
解释:
linux:首次登录执行.bash_profile,其内执行.bashrc,所有代码都运行到。以后每次打开终端虽然只执行.bashrc,但环境变量自动继承父进程的仍然可以得到。
mac:每次都是执行.bash_profile,其内执行.bashrc,所有代码都运行到。
其它问题:
1、在bashrc里不应该放echo之类产生输出的代码,否则会导致rsync失败。