shell的模式与环境变量的配置文件

四种模式

登录式Shell(login shell)

取得 bash 时需要完整的登入流程,就称为 login shell

正常通过某终端登录的 shell,当系统启动时或开启一个新的终端登录系统时,系统通过调用 /bin/login 程序处理登录并在一个 shell 中显示命令行提示符,这个 shell 就是 login shell;该 shell 程序可以是 bash 也可以是 sh 或 csh,具体使用哪种 shell 可以在 /etc/passwd 中设置(/bin/login 程序读取该文件决定使用哪种 Shell)。

使用命令 su - USERNAMEsu -l USERNAME 进行用户切换,这种切换方式是完全切换到了另一个的用户环境,也是 login shell

非登录式Shell(non-login shell)

X window 登入Linux后,再以X的图形化界面启动命令终端,此时的命令终端并不需要再次输入用户名和密码,所以此时 bash 的环境就称为 non-login shell

自动执行的 shell 脚本也是 non-login shell

使用命令 su USERNAME 进行用户切换,这种切换方式不会切换使用用户的环境,也属于 non-login shell

Interactive shell and non-interactive shell

interactive shell 即交互式 shell,会有一个输入提示符,并且它的标准输入、输出和错误输出都会显示在控制台上。所以一般来说只要是需要用户交互的,即一个命令一个命令的输入的 shell 都是 interactive shell

non-interactive shell,即非交互式 shell,无需用户交互。通常来说如 bash script.sh 此类执行脚本的命令就会启动一个 non-interactive shell,它不需要与用户进行交互,执行完后它便会退出创建的 shell。

打印 shell 内置的特殊变量 $-,就能知道当前的 shell 是不是交互式的。一旦输出的结果中包含了 i 就说明当前的 shell 是 interactive shell ,也就是交互式 shell。

1
2
3
[user1@study ~]$ echo $-
himBH
[user1@study ~]$

典型的启动方式及其shell模式

1)登陆机器后的第一个Shell:属于 login + interactive

2)新启动一个 Shell 进程,如运行bash:属于 non-login + interactive

3)执行脚本,如 bash script.sh:属于 non-login + non-interactive

4)运行头部有如 #!/usr/bin/env bash 的可执行文件,如 ./executable:属于 non-login + non-interactive

5)通过ssh登陆到远程主机:属于 login + interactive

6)远程执行脚本,如 ssh user@remote script.sh:属于 non-login + non-interactive

7)远程执行脚本,同时请求控制台,如 ssh user@remote -t 'echo $PWD':属于 non-login + interactive

8)在图形化界面中打开终端:属于 non-login + interactive

Bash 环境变量的配置文件

全局配置:针对所有用户生效的,它的配置文件有 /etc/profile/etc/profile.d/*.sh 以及 /etc/bashrc

个人配置:仅对当前用户生效,每个用户家目录都有两个环境变量配置文件 ~/.bash_profile~/.bashrc

文件的读取顺序

登录式shell

1)登陆
2)执行 /etc/profile
3)/etc/profile 调用并执行 /etc/profile.d/*.sh
4) 执行 ~/.bash_profile ==>
5) ~/.bash_profile 调用并执行 ~/.bashrc
6) ~/.bashrc 调用并执行 /etc/bashrc
命令提示符

非登录式shell

~/.bashrc ==> /etc/bashrc ==> /etc/profile.d/*.sh

Bash 环境变量配置文件作用

profile 类的文件用来设定系统环境环境和启动程序,用于登录的设置;bashrc 类的文件用于设定本地变量,定义命令别名

/etc/profile

它是系统整体的配置文件,该配置文件里包含很多重要的变量信息,每个用户登陆取得 bash 后一定会读取这个配置文件。如果你想要设定环境变量对所有用户起作用,就要在这个地方设置。大概内容如下:

(1) USER 变量设置。
(2) LOGNAME 变量设置。
(3) MAIL 变量设置。
(4) PATH 变量设置。
(5) HOSTNAME 变量设置。
(6) HISTSIZE 变量设置1000。
(7) 然后使用export把以上所有变量声明成环境变量。
(8) 管理员和普通用户的umask设置。
(9) 调用并执行 /etc/profile.d/*.sh 文件。

/etc/profile.d/*.sh

在这个目录下一般用户可以自定义一些脚本,系统默认也有一些脚本,如 /etc/profile.d/lang.sh 这个脚本,其中最重要的就是这个脚本调用了 /etc/locale.conf$HOME/.i18n 这两个文件,而这个文件中定义的就是系统的默认语言

1
2
3
[user1@study ~]$ cat /etc/locale.conf 
LANG="en_US.UTF-8"
[user1@study ~]$

~/.bash_profile

这个文件文件会先检查 ~/.bashrc 是否存在,然后会执行 export PATH 定义 PATH 这个环境变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
[user1@study ~]$ cat ~/.bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

~/.bashrc

这个文件中会先检查 /etc//.bashrc 是否存在,然后调用并执行。~/.bashrc 主要是用来定义别名使用的,如果你要定义别名就可以放在这个文件中

/etc/bashrc

这个文件定义了 PS1 变量,可以用来设定登录提示符等信息;设定本地变量,添加定义命令别名。并且特别针对非登录的 shell 重新设定了一些变量,如 PATHPS1 等。

注意: 按照文件的启动顺序,基本上定义的所有变量都会生效,但是后面启动的文件中定义的变量会覆盖前面文件中定义的相同名称的变量。所以要想更好地设定一些变量和别名,就需要知道这些文件的作用域以及非登录式 shell 和登录式 shell 各自应用哪些文件

其他变量配置文件

  • ~/.bash_logout

用户登出时使用的配置文件,默认这个文件是空的,如果你想在退出系统时做什么操作就可以在这个文件中定义,如果说退出登录时可以执行命令“history -c”清空历史命令。

  • ~/.bash_history

这个文件是用来记录用户操作的历史命令的,默认HISTSIZE=1000定义在/etc/profile文件中,你可以把这个变量值改的大一点都行。但是注意这个文件中定义的历史命令跟你用history命令查看的可能不尽相同。因为文件中的都是磁盘上,而history查看的在内存中。

  • ~/.viminfo

用环境变量来定义vim使用时的一些状态,比如是否显示行数、高亮等。

  • ~/.vimrc

vim的用户配置,全局配置文件为/etc/vimrc

  • ~/.mysql_history

安装MySQL之后就会生成这个文件,跟.bash_history作用基本相同,不同的是.mysql_history是用来记录SQL语句的。

将配置文件立即生效

使用 source. 都可以使环境变量配置文件立即生效,也可用于在编写脚本时加载脚本定义的配置文件

1
2
source /PATH/TO/PROFILE
. /PATH/TO/PROFILE
有钱任性,请我吃包辣条
0%