03-Shell环境变量深入
1. 自定义系统环境变量
1.1 全局配置文件/etc/profile应用场景
当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量, 供给所有Shell程序使用
以后只要是所有Shell程序或命令使用的变量, 就可以定义在这个文件中
1.2 案例
/etc/profile定义存储自定义系统级环境变量数据
1.2.1 创建环境变量步骤
- 编辑/etc/profile全局配置文件
# 增加命令: 定义变量VAR1=VAR1 并导出为环境变量
# 扩展: vim里面的命令模式使用G快速定位到文件末尾位置, 使用gg定位到文件首行位置
- 重载配置文件/etc/profile, 因为配置文件修改后要立刻加载里面的数据就需要重载, 语法
source /etc/profile
- 在Shell环境中读取系统级环境变量VAR1
1.2.2 步骤实现
1、编辑/etc/profile文件
vim /etc/profile
2、添加设置变量VAR1=VAR1并导出成为环境变量, 在/etc/profile文件末尾添加如下命令
# 创建环境变量
VAR1=VAR1
export VAR1
3、保存/etc/profile退出
4、重新加载/etc/profile文件数据更新系统环境变量
source /etc/profile
注意:如果这一步不执行,无法读取更新的环境变量
5、输出环境变量VAR1
echo $VAR1
2. 加载流程介绍
2.1 Shell工作环境介绍
用户登录系统时,Shell为用户定义了工作环境,工作环境提供了共享数据环境变量,比如shell解析器类型、主机名等,这些数据存储在环境变量中,便于shell脚本程序操作使用;
2.2 shell工作环境分类
交互式与非交互式shell
- 交互式Shell
是shell的一种运行模式,交互式shell等待你输入命令,并且立即执行,然后将结果反馈给你。这是每个CLI用户都非常熟悉的流程:登录、执行一些命令、登出。当你登出后,这个shell就终止了。
- 非交互式Shell
是shell的另一种运行模式,它专门被用来执行预先设定的命令。在这种模式下,shell不与用户进行交互,而是读取存放在脚本文件中的命令并执行它们。当它读到文件的结尾,这个shell就终止了。
登录Shell与非登录Shell环境
类型名称 | 含义 |
---|---|
shell登录环境 | 需要用户名、密码登录之后才能进入的shell |
shell非登录环境 | 直接不用输入用户名和密码就可以打开的shell 或调用子Shell时使用的工作环境 |
注意:不同的工作环境加载环境变量流程不一样
2.3 环境变量加载流程介绍
3. 环境变量加载流程测试
3.1 切换Shell环境执行脚本文件介绍
在执行一个脚本文件时可以指定具体的Shell环境进行执行脚本文件,这个就是切换Shell环境执行脚本
Shell登陆环境执行脚本文件的语法
sh/bash -l/--login 脚本文件
含义:先加载Shell登录环境流程初始化环境变量,再执行脚本文件
Shell非登陆环境变量执行脚本文件语法
bash # 加载Shell非登录环境
bash/sh 脚本文件 # 直接执行脚本文件
含义:先执行加载Shell非登录环境流程初始化环境变量,再执行脚本文件
3.2 案例
在/etc/profile与/当前用户/.bashrc文件分别设置不同的环境变量,然后创建shell脚本文件输出设置的环境变量,最后切换不同环境执行shell脚本文件观察验证上面的流程运行
3.2.1 分析
1、编辑/etc/profile文件,添加环境变量VAR1=VAR1
2、编辑/当前用户/.bashrc文件,添加环境变量VAR2=VAR2
3、创建demo1.sh脚本文件,并编辑文件输出VAR1、VAR2两个变量
4、直接执行demo1.sh脚本文件, 观察什么也没有输出
5、加载Shell非登录环境变量, 观察VAR2输出, VAR1没有输出
6、加载Shell登录环境变了, 观察VAR1,VAR2都有输出
3.2.2 执行过程
编辑/etc/profile文件
vim /etc/profile
编辑添加如下内容,保存退出
在root目录下,编辑.bashrc文件
vim .bashrc
添加最后两行内容
创建文件demo1.sh
touch demo1.sh
编辑文件demo1.sh,添加如下内容
#!/bin/bash
echo $VAR1
echo $VAR2
直接执行
bash demo1.sh
直接执行脚本文件, 即没有加载登录Shell环境变量, 也没有加载非登录Shell环境变量
先加载非登录Shell环境变量, 然后执行脚本文件
bash
bash demo1.sh
Shell非登录环境会加载文件
当前用户/.bashrc
的环境变量数据所以这里会输出VAR2的环境变量数据
先加载登录Shell环境变量, 然后执行脚本文件
bash -l demo1.sh
Shell登录环境会加载文件
etc/profile
和当前用户/.bashrc
的环境变量数据
所以这里会输出VAR1和VAR2的环境变量数据
3.2.3 总结
- 登录执行的Shell的环境变量
/etc/profile(推荐)
/当前用户/.bash_profile
- 非登录执行的Shell环境变量
/当前用户/.bashrc (当前用户)
/etc/bashrc (全局)
4.识别Shell环境类型
使用$0识别环境语法
echo $0
输出
-bash
代表:shell登录环境输出
bash
代表: shell非登录环境注意:这个
$0
环境变量如果用在子shell中(shell脚本文件)输出Shell脚本本身的文件名
bash命令语法
bash
bash命令:用于切换为Shell非登录环境
分析
1、直接登录系统为shell登录环境输出 $0 观察输出信息效果
2、使用 bash 命令切换为shell非登录环境输出 $0 观察输出信息效果
3、创建test.sh脚本文件,编辑添加输出 $0 ,编程保存完成后执行test.sh脚本文件观察输出信息效果
直接登录linux系统使用如下命令效果
bash命令将当前环境转换为Shell非登录环境
$0识别Shell环境不能用在脚本文件中
5. 退出Shell环境
logout命令语法
logout
logout命令: 用于退出Shell登录环境
exit命令语法
exit
exit命令: 用于退出Shell登录或非登录环境
区别
logout
只能退出Shell登录环境
exit
可以退出Shell登录与非登录环境
6.详细切换Shell环境
- 直接登录系统
直接在虚拟机上使用用户名与密码登录linux系统或使用客户端直接连接远程linux系统,直接就是登录Shell环境
- su切换用户登录
语法1
su 用户名 --login
或
su 用户名 -l
# 切换到指定用户, 加载Shell登录环境变量
语法2
su 用户名
# 切换到指定用户, 加Shell非登录环境变量
- 语法1
su 用户名 --login
或
su 用户名 -l
# 切换到指定用户, 加载Shell登录环境变量
语法2
su 用户名
# 切换到指定用户, 加Shell非登录环境变量
- bash切换
bash # 加载【Shell非登录环境】
语法2:
bash -l Shell脚本文件 / bash --login shell脚本文件
sh -l shell脚本文件 / sh --login shell脚本文件
# 先加载【Shell登录环境】然后运行指定Shell脚本文件