关于login/interactive/no-interactive shell和profile/bash_profile/bashrc

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失败。

原文地址:https://www.cnblogs.com/wellbye/p/3738024.html