四种模式
登录式Shell(login shell)
取得 bash 时需要完整的登入流程,就称为 login shell
正常通过某终端登录的 shell,当系统启动时或开启一个新的终端登录系统时,系统通过调用 /bin/login
程序处理登录并在一个 shell 中显示命令行提示符,这个 shell 就是 login shell
;该 shell 程序可以是 bash 也可以是 sh 或 csh,具体使用哪种 shell 可以在 /etc/passwd
中设置(/bin/login
程序读取该文件决定使用哪种 Shell)。
使用命令 su - USERNAME
或 su -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 | [user1@study ~]$ echo $- |
典型的启动方式及其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 | [user1@study ~]$ cat /etc/locale.conf |
~/.bash_profile
这个文件文件会先检查 ~/.bashrc
是否存在,然后会执行 export PATH
定义 PATH
这个环境变量。
1 | [user1@study ~]$ cat ~/.bash_profile |
~/.bashrc
这个文件中会先检查 /etc//.bashrc
是否存在,然后调用并执行。~/.bashrc
主要是用来定义别名使用的,如果你要定义别名就可以放在这个文件中
/etc/bashrc
这个文件定义了 PS1
变量,可以用来设定登录提示符等信息;设定本地变量,添加定义命令别名。并且特别针对非登录的 shell 重新设定了一些变量,如 PATH
,PS1
等。
注意: 按照文件的启动顺序,基本上定义的所有变量都会生效,但是后面启动的文件中定义的变量会覆盖前面文件中定义的相同名称的变量。所以要想更好地设定一些变量和别名,就需要知道这些文件的作用域以及非登录式 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 | source /PATH/TO/PROFILE |