1. profile、bashrc、bash_profile、bash_logout
1.1. /etc/profile
与 ~/.bash_profile
/etc/profile
:此文件为系统的每个用户设置环境信息,当用户第一次登录时该文件被执行,并从 /etc/profile.d
目录的配置文件中搜集 shell 的设置。有修改的话必须得重启你的修改才会生效,此修改对每个用户都生效。
~/.bash_profile
:每个用户都可使用该文件输入专用于自己使用的 shell 信息,当用户登录时,该文件仅仅执行一次。默认情况下,他设置一些环境变量,执行用户的 .bashrc 文件。需要重启才会生效。
~/.bash_login
和 ~/.profile
文件,作为对其他shell的兼容,与 ~/.bash_profile
文件的作用是相同,比如在 Debian 中使用.profile
文件代替.bash_profile
文件
1.2. /etc/bashrc
与 ~/.bashrc
/etc/bashrc
:为每一个运行 bash shell 的用户执行此文件,当 bash shell 被打开时,该文件被读取。
~/.bashrc
:该文件包含专用于你的 bash shell 的 bash 信息,当登录时以及每次打开新的 shell 时,该文件被读取。重新打开一个 bash 即可生效。
.bashrc
文件会在bash shell调用另一个 bash shell 时读取,也就是在 shell 中再键入 bash 命令启动一个新 shell 时就会去读该文件。这样可有效分离登录和子 shell 所需的环境。但一般来说都会在.bash_profile
里调用.bashrc
脚本以便统一配置用户环境。
1.3. ~/.bash_logout
~/.bash_logout
:当每次退出系统(退出bash shell)时,执行该文件。
1.4. 交互shell(interactive shell)、登录shell(login shell)
1.4.1. 交互式shell和非交互式shell(interactive shell and non-interactive shell)
- 交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
- 非交互式模式shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。
- 可以通过打印
$-
变量的值(代表着当前shell的选项标志),查看其中的i
选项(表示interactive shell)来区分交互式与非交互式shell。
1 2 3 4 5
| master@user:~/workspace/shell$ echo $- himBH master@user:~/workspace/shell$ ./test.sh echo $- hB
|
1.4.2. 登录shell和非登录shell
- 登录 shell:是需要用户名、密码登录后才能进入的shell(或者通过”–login”选项生成的shell)。
- 非登录 shell:当然就不需要输入用户名和密码即可打开的 Shell,例如:直接命令
bash
就是打开一个新的非登录 shell,在 Gnome 或 KDE 中打开一个“终端”(terminal)窗口程序也是一个非登录shell。
- 执行 exit 命令,退出一个 shell(登录或非登录shell);执行 logout 命令,退出登录 shell(不能退出非登录shell)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| master@user:~$ bash --login master@user:~$ logout master@user:~$ bash --login master@user:~$ exit logout
master@user:~$ bash master@user:~$ logout bash: logout: not login shell: use `exit' master@user:~$ exit exit
# bash是 login shell 时,其进程名为”-bash“ 而不是”bash” # 在 login shell 中: [perf@host_220-188 ~]$ echo $0 -bash [perf@host_220-188 ~]$ ps -ef | grep '\-bash' | grep -v grep root 16823 16821 0 May06 pts/0 00:00:00 -bash perf 21135 21134 0 May07 pts/1 00:00:00 -bash
# 在一个非登陆shell中: jay@jay-linux:~$ echo $0 /bin/bash jay@jay-linux:~$ ps -ef | grep '\-bash' | grep -v grep jay@jay-linux:~$
|
1.5. 关系
startup 文件 |
交互登录 |
非交互登录 |
交互非登录 |
非交互非登录 |
/etc/profile |
直接执行1 |
直接执行1 |
|
|
~/.bash_profile |
直接执行2 |
直接执行2 |
|
|
~/.bash_login |
条件执行2 |
条件执行2 |
|
|
~/.profile |
条件执行2 |
条件执行2 |
|
|
~/.bash_logout |
直接执行3 |
不执行 |
|
|
etc/bash.bash_logout |
直接执行4 |
不执行 |
|
|
~/.bash |
引用执行2.1 |
引用执行2.1 |
直接执行1 |
|
/etc/bashrc |
引用执行2.2 |
引用执行2.2 |
引用执行1.1 |
|
备注:
直接执行
表示此文件被系统直接调用,它的执行是无条件的;
条件执行
表示此文件被系统调用是有先决条件的(没有优先级更高的文件可用);
引用执行
表示此文件不是被系统直接调用的,而是被其他文件显式调用的;
- 后面的数字表示文件被调用的顺序,数字越大调用越靠后;
非交互非登陆
shell的配置文件可以由BASH_ENV环境变量指定;
~/.bash_profile
会显式调用~/.bashrc文件
,而~/.bashrc
又会显式调用/etc/bashrc
文件,这是为了让所有交互式界面看起来一样;