linux的环境变量

本文详细介绍了Linux环境变量的管理,包括查看全局和局部环境变量,设置新的环境变量,以及如何删除这些变量。通过`env`、`printenv`、`set`命令查看环境变量,使用`export`导出为全局变量,使用`unset`删除变量。此外,还强调了全局变量在子shell中的作用域和局部变量的生命周期。

环境变量:存储有关shell会话和工作环境的信息。环境变量允许你在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们。
在bash shell中,环境变量分为两类:

  • 全局变量
  • 局部变量

尽管bash shell使用一致的专有环境变量,但不同的Linux发行版经常会添加其自有的环境
变量。

1.全局环境变量

全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。Linux系统在你开始bash会话时就设置了一些全局环境变量。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。

1.1查看环境变量
要查看全局变量,可以使用env或printenv命令,例如:

[root@node1 ~]# env
XDG_SESSION_ID=229128
HOSTNAME=node1
TERM=xterm
SHELL=/bin/bash
HISTSIZE=10000
[....]
MAIL=/var/spool/mail/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
PWD=/root
LANG=en_US.UTF-8
HISTCONTROL=ignoredups
SHLVL=1
HOME=/root
LOGNAME=root
SSH_CONNECTION=124.126.202.78 28612 192.168.0.147 22
LESSOPEN=||/usr/bin/lesspipe.sh %s
XDG_RUNTIME_DIR=/run/user/0
HISTTIMEFORMAT=%F %T root 
_=/usr/bin/env

1.2显示某个变量的值
要显示个别环境变量的值,使用printenv命令,使用env命令会报错。

[root@node1 ~]# printenv HOME
/root
[root@node1 ~]# env HOME
env: HOME: No such file or directory

也可以使用echo显示变量的值。在这种情况下引用某个环境变量的时候,必须在变量前面加上一个美元符($)

[root@node1 ~]# echo $HOME
/root

在变量名前加上$可以让变量作为命令行参数。例如查看根目录/root

[root@node1 ~]# ls $HOME
a.txt  c3pool                       get-docker.sh  name.txt    r.txt    sort.txt  uniq.txt
b.txt  ejabberd-20.03-0.x86_64.rpm  install.sh     newsed.txt  sed.txt  split
[root@node1  ~]# ls /root
a.txt  c3pool                       get-docker.sh  name.txt    r.txt    sort.txt  uniq.txt
b.txt  ejabberd-20.03-0.x86_64.rpm  install.sh     newsed.txt  sed.txt  split

1.3全局变量作用域
正如前面提到的,全局环境变量可用于进程的所有子shell。例如:

[root@node1 ~]# bash
[root@node1  ~]# ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
root     22220 22212  0 17:31 pts/0    00:00:00 -bash
root     25026 22220  0 18:22 pts/0    00:00:00 bash
root     25052 25026  0 18:23 pts/0    00:00:00 ps -f
[root@node1  ~]# echo $HOME
/root

1.4设置全局环境变量
创建全局环境变量的方法是先创建一个局部环境变量,然后再把它导出到全局环境中。例如:

[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now

注意的是:修改子shell中全局环境变量并不会影响到父shell中该变量的值。子shell甚至无法使用export命令改变父shell中全局环境变量的值。

[root@node1 ~]# my_variable='I am Global now' 
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# my_variable='NULL'
[root@node1 ~]# echo $my_variable
NULL
[root@node1 ~]# exit
exit
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1  ~]# bash
[root@node1  ~]# echo $my_variable
I am Global now
[root@node1  ~]# my_variable='NULL'
[root@node1  ~]# export my_variable
[root@node1  ~]# echo $my_variable
NULL
[root@node1  ~]# exit
exit
[root@node1  ~]# echo $my_variable
I am Global now

1.5 删除全局环境变量
删除命令为unset,例如:

[root@node1 ~]# echo $my_variable

[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# unset my_variable
[root@node1 ~]# echo $my_variable

[root@node1 ~]# 

需要注意一点的是:如果在子进程中删除了一个全局环境变量,这只对子进程有效。该全局环境变量在父进程中依然可用。

[root@node1 ~]# my_variable='I am Global now'
[root@node1 ~]# export my_variable
[root@node1 ~]# bash
[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# unset my_variable
[root@node1 ~]# echo $my_variable

[root@node1 ~]# exit
exit
[root@node1 ~]# echo $my_variable
I am Global now

2.局部环境变量

局部环境变量只能在定义它们的进程中可见事实上,Linux系统也默认定义了标准的局部环境变量,也可以定义自己的局部变量。

2.1查看命令
在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户自定义变量。例如:

[root@node1 ~]# set
BASH=/usr/bin/bash
BASHOPTS=checkwinsize:cmdhist:expand_aliases:extquote:force_fignore:histappend:hostcomplete:interactive_comments:progcomp:promptvars:sourcepath
BASH_ALIASES=()
BASH_ARGC=()
BASH_ARGV=()
[....]
USER=root
XDG_RUNTIME_DIR=/run/user/0
XDG_SESSION_ID=229128
_=/root
colors=/root/.dircolors

注意:set命令会显示出全局变量、局部变量以及用户定义变量,且还会按照字母顺序对结果进行排序。
env和printenv命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。

2.2 设置局部用户自定义变量
一旦启动了bash shell(或者执行一个shell脚本),就能创建在这个shell进程内可见的局部变量了。可以通过等号给环境变量赋值,值可以是数值或字符串,若赋一个含有空格的字符串值,必须用单引号来界定字符串的首和尾。

变量名区分大小写。按照bash shell的标准惯例,所有的环境变量名均使用大写字母,如果是你自己创建的局部变量或是shell脚本,请使用小写字母。例如:

[root@node1 ~]# echo $first_variable

[root@node1  ~]# first_variable='Hello World'
[root@node1  ~]# echo $first_variable
Hello World

设置了局部环境变量后,就能在shell进程的任何地方使用它了。但是,它在子shell中就不可用,相同的,在子shell设置的局部环境变量,父shell也不可用。例如:

[root@node1 ~]# echo $first_variable

[root@node1 ~]# first_variable='Hello World'
[root@node1 ~]# echo $first_variable
Hello World
[root@node1 ~]# bash
[root@node1 ~]# echo $first_variable

[root@node1 ~]# echo $child_variable

[root@node1 ~]# child_variable='Hello World'
[root@node1 ~]# echo $child_variable
Hello World
[root@node1 ~]# exit
exit
[root@node1 ~]# echo $child_variable

[root@node1 ~]# 

2.3 删除局部用户自定义变量
与删除全局环境变量一样,使用unset命令

[root@node1 ~]# echo $my_variable
I am Global now
[root@node1 ~]# unset my_variable
[root@node1 ~]# echo $my_variable

[root@node1 ~]# 

在上面变量的介绍中,涉及环境变量名时,什么时候该使用$,什么时候不该使用$,大家估计存在疑惑。使用的窍门是:如果要用到变量,使用$;如果要操作变量,不使用$。这条规则的一个例外就是使用printenv显示某个变量的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远不要矫情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值