Linux 碎片知识(持续更新)

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

备注:

  1. 直接执行表示此文件被系统直接调用,它的执行是无条件的;
  2. 条件执行表示此文件被系统调用是有先决条件的(没有优先级更高的文件可用);
  3. 引用执行表示此文件不是被系统直接调用的,而是被其他文件显式调用的;
  4. 后面的数字表示文件被调用的顺序,数字越大调用越靠后;
  5. 非交互非登陆 shell的配置文件可以由BASH_ENV环境变量指定;
  6. ~/.bash_profile会显式调用~/.bashrc文件,而~/.bashrc又会显式调用/etc/bashrc文件,这是为了让所有交互式界面看起来一样;