环境变量是一些已经赋了值的变量,在bash shell中,环境变量分为两类:
* 全局变量
* 局部变量
查看变量
set
set命令会显示出全局变量、局部变量以及用户定义变量。
env
[root@zzz ~]# env
XDG_SESSION_ID=18849
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_TTY=/dev/pts/2
USER=root
_=/usr/bin/env
...
printenv
[root@zzz ~]# printenv
XDG_SESSION_ID=18849
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
SSH_TTY=/dev/pts/2
USER=root
_=/usr/bin/env
...
[root@zzz ~]# printenv USER
root
printenv与env一样,printenv多了可以显示单个变量的功能
设置变量
局部变量
#变量名、等号和值之间没有空格
my_variable=Hello
echo $my_variable
#Hello
全局变量
my_variable="I am Global now"
export my_variable
echo $my_variable
#I am Global now
可见性
全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的
shell可见。
[root@zzz ~]# var1=5
[root@zzz ~]# echo $var1
5
[root@zzz ~]# bash
[root@zzz ~]# echo $var1
[root@zzz ~]
全局环境变量修改只对当前shell有效
[root@zzz ~]# printenv GOROOT
/usr/local/go1
[root@zzz ~]# GOROOT=/usr/local/go
[root@zzz ~]# printenv GOROOT
/usr/local/go
[root@zzz ~]# GOROOT=/usr/local/go1
[root@zzz ~]# printenv GOROOT
/usr/local/go1
[root@zzz ~]# bash
[root@zzz ~]# printenv GOROOT
/usr/local/go
删除变量unset
如果你是在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用
[root@zzz ~]# globle_var=5
[root@zzz ~]# export globle_var
[root@zzz ~]# echo $globle_var
5
[root@zzz ~]# bash
[root@zzz ~]# echo $globle_var
5
[root@zzz ~]# unset globle_var
[root@zzz ~]# echo $globle_var
[root@zzz ~]# exit
exit
[root@zzz ~]# echo $globle_var
5
系统环境变量初始化
Linux系统中有很多默认环境变量,我们需要了解变量的加载过程。
启动bash shell有3种方式:
- 登录时作为默认登录shell(账号密码登录)
- 作为非登录shell的交互式shell(界面系统打开终端,子shell)
- 作为运行脚本的非交互shell(脚本启动shell)
登录 shell
登录shell会从5个不同的启动文件里读取命令:
- /etc/profile
- $HOME/.bash_profile
- $HOME/.bashrc
- $HOME/.bash_login
- $HOME/.profile
交互式 shell 进程
如果bash是作为交互式shell启动的,它就不会访问/etc/profile文件,只会检查用户HOME目录
中的.bashrc文件。
非交互式 shell
bash shell提供了BASH_ENV环境变量。当shell启动一个非交互式shell进
程时,它会检查这个环境变量来查看要执行的启动文件。如果有指定的文件,shell会执行该文件
里的命令,这通常包括shell脚本变量设置
网友评论