常用环境变量
env
命令可以查看所有全局环境变量set
命令还可查看局部环境变量
# 当前用户主目录
$HOME
# 当前目录
$PWD
# 环境变量(查找输入的内置命令的路径集合)
$PATH
# 当前用户名
$USER
# 当前使用的shell
$SHELL
# 当前进程的PID
$$
shell中设置环境变量(临时生效)
- 添加环境变量是
export,删除环境变量是
unset`export
设置的环境变量可用于其创建的所有子shell
- 通过export设置的环境变量在shell退出后失效
- 只有写入 /etc/profile 等文件中才会长期生效
- 原理是每次启动shell前会读取指定文件
source xxx
的作用在本shell中执行程序,不启动子shell./xxx
执行时,启动的是子shell,此时脚本中export出的变量是不能被父shell(即当前shell)使用的,所以需要使用source来执行
- 我们在shell脚本中赋值给变量实际是在设置局部环境变量
- 这种环境变量不会被子shell继承
- 可以在脚本中通过
export
把前面的局部环境变量导出为全局环境变量
- 如果我们在脚本中赋值的变量没有
export
,则通过脚本启动的程序不能看到脚本中设置的环境变量- 因为实际上启动了子shell来执行程序
- 通过exec启动也不能使用非
export
的环境变量- exec启动的好处在于可以接收到上层给脚本的信号
- 这在容器中很关键
# 1.sh
export a="hello"
b="world"
# 输出 hello,没有world
./2.sh
exec ./2.sh
# 2.sh
echo "$a $b"
- 进程拥有的环境变量在
/proc/$pid/environ
文件中 - 参考
shell预加载环境变量文件(长期生效)
-
登陆shell
- 场景
- 终端登陆时,ssh链接时,
su --login <username>
切换用户时
- 终端登陆时,ssh链接时,
- 用bash登陆时会从下面6个文件读取命令:
- 全局
/etc/profile
- 里面会启动
/etc/bashrc
或者/etc/bash.bashrc
- 里面会启动
- 用户级
- 大多数发行版只用到了甚至只创建了其中的一到两个文件
- shell会按照下面的顺序查找前三个文件并运行第一个被找到的文件,其与忽略
~/.bash_profile
~/.bashrc
会在启动~/.bash_profile
时被查找
~/.bash_login
~/.profile
- 全局
- 使用zsh登录时加载的是~/.zshrc和/etc/zshrc目录下的文件
- 场景
-
非登陆时的交互式shell
- 场景
- 直接运行 bash 时,
su <username>
切换用户时(前面没有加 --login)
- 直接运行 bash 时,
- 启动时只会读取
/etc/profile
和~/.bashrc
文件
- 场景
-
非交互式shell
- 执行shell脚本时用到这种shell
- 如果设置了环境变量
BASH_ENV
, 会执行其指定的文件 - 否则使用启动脚本的shell拥有的环境变量