reverse_xiaoyu

忘记并不可怕,可怕的是你从来就都不知道!

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

Linux环境变量

全局环境变量与局部环境变量

  Linux环境变量能帮助我们提升Linux shell得体验。很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。在Linux系统上有很多地方可以设置环境变量,了解去哪里设置相应得环境变量很重要!

什么是环境变量

  bash shell用一个叫作环境变量(environment variable)的特性来存储有关shell会话和工作环境的信息(这也是被称作环境变量的原因)。这项特性允许在内存中存储数据,以便程序或shell中运行的脚本能够轻松访问到它们,这也是储存持久数据的一种简便方法。

  在bash shell中,环境变量分为两类:

  •   全局变量
  •   局部变量

  全局环境变量

  全局环境变量对于shell会话和所有生成的子shell都是可见的。局部变量则只对创建它们的shell可见。这让全局环境变量对那些所创建的子shell需要获取父shell信息的程序来说非常有用。Linux系统在开始bash会话时就设置了一些全局环境变量。系统环境变量基本上都是使用全大写字母,以区别于普通用户的环境变量。要查看全局变量,可以使用env或printenv命令。

  由于信息过多,只截取部分

 1 xiaoyu@Admin:~$ printenv
 2 XDG_VTNR=7
 3 LC_PAPER=zh_CN.UTF-8
 4 LC_ADDRESS=zh_CN.UTF-8
 5 XDG_SESSION_ID=c2
 6 XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xiaoyu
 7 LC_MONETARY=zh_CN.UTF-8
 8 CLUTTER_IM_MODULE=xim
 9 SESSION=ubuntu
10 GPG_AGENT_INFO=/home/xiaoyu/.gnupg/S.gpg-agent:0:1
11 TERM=xterm-256color
12 VTE_VERSION=4205
13 XDG_MENU_PREFIX=gnome-
14 SHELL=/bin/bash
15 QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
16 WINDOWID=56623114
17 LC_NUMERIC=zh_CN.UTF-8

 

 1 xiaoyu@Admin:~$ env
 2 XDG_VTNR=7
 3 LC_PAPER=zh_CN.UTF-8
 4 LC_ADDRESS=zh_CN.UTF-8
 5 XDG_SESSION_ID=c2
 6 XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/xiaoyu
 7 LC_MONETARY=zh_CN.UTF-8
 8 CLUTTER_IM_MODULE=xim
 9 SESSION=ubuntu
10 GPG_AGENT_INFO=/home/xiaoyu/.gnupg/S.gpg-agent:0:1
11 TERM=xterm-256color
12 VTE_VERSION=4205
13 XDG_MENU_PREFIX=gnome-
14 SHELL=/bin/bash
15 QT_LINUX_ACCESSIBILITY_ALWAYS_ON=1
16 WINDOWID=56623114
17 LC_NUMERIC=zh_CN.UTF-8

 

  要显示个别环境变量的值,可以使用printenv命令,但是不要用env命令。

1 xiaoyu@Admin:~$ printenv HOME
2 /home/xiaoyu
3 xiaoyu@Admin:~$ 
4 xiaoyu@Admin:~$ env HOME
5 env: ‘HOME’: No such file or directory
6 xiaoyu@Admin:~$ 

 

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

1 xiaoyu@Admin:~$ echo $HOME
2 /home/xiaoyu
3 xiaoyu@Admin:~$ 

 

  在echo命令中,在变量名前加上$可不仅仅是要显示变量当前的值。它能够让变量作为命令行参数

1 xiaoyu@Admin:~$ ls $HOME
2 Desktop    Downloads         Music      Pictures  Templates  video.tar
3 Documents  examples.desktop  music.tar  Public    Videos
4 xiaoyu@Admin:~$ 

 

1 xiaoyu@Admin:~$ ls /home/xiaoyu/
2 Desktop    Downloads         Music      Pictures  Templates  video.tar
3 Documents  examples.desktop  music.tar  Public    Videos
4 xiaoyu@Admin:~$ 

 

  全局变量可用于进程的所有子shell

 1 xiaoyu@Admin:~$ bash
 2 xiaoyu@Admin:~$ ps -f
 3 UID         PID   PPID  C STIME TTY          TIME CMD
 4 xiaoyu     3072   3065  0 10:44 pts/2    00:00:00 bash
 5 xiaoyu     4112   3072  0 11:24 pts/2    00:00:00 bash
 6 xiaoyu     4122   4112  0 11:24 pts/2    00:00:00 ps -f
 7 xiaoyu@Admin:~$ echo $HOME
 8 /home/xiaoyu
 9 xiaoyu@Admin:~$ exit
10 exit
11 xiaoyu@Admin:~$ 

 

  此例中,用bash命令生成一个子shell后,显示了HOME环境变量的当前值,这个值和父shell中的一摸一样,都是/home/xiaoyu。

  局部环境变量

  顾名思义,局部环境变量只能在定义它们的进程中可见。尽管它们是局部的,但是和全局环境变量一样重要。事实上,Linux系统也默认定义了标准的局部环境变量。不过你也可以定义自己的局部变量,如你所想,这些变量被称为用户定义局部变量。
  查看局部环境变量的列表有点复杂。遗憾的是,在Linux系统并没有一个只显示局部环境变量的命令。set命令会显示为某个特定进程设置的所有环境变量,包括局部变量、全局变量以及用户定义变量。
 1 xiaoyu@Admin:~$ set
 2 BASH=/bin/bash
 3 BASHOPTS=checkwinsize:cmdhist:complete_fullquote:expand_aliases:extglob:extquote:force_fignore:histappend:interactive_comments:progcomp:promptvars:sourcepath
 4 BASH_ALIASES=()
 5 BASH_ARGC=()
 6 BASH_ARGV=()
 7 BASH_CMDS=()
 8 BASH_COMPLETION_COMPAT_DIR=/etc/bash_completion.d
 9 BASH_LINENO=()
10 BASH_REMATCH=()
11 BASH_SOURCE=()
12 BASH_VERSINFO=([0]="4" [1]="3" [2]="48" [3]="1" [4]="release" [5]="x86_64-pc-linux-gnu")
13 BASH_VERSION='4.3.48(1)-release'
14 CLUTTER_IM_MODULE=xim
15 COLUMNS=97

  可以看到,所有通过printenv命令能看到的全局环境变量都出现在了set命令的输出中。但在set命令的输出中还有其他一些环境变量,即局部环境变量和用户定义变量。

  说明 命令env、printenv和set之间的差异很细微。set命令会显示出全局变量、局部变量以及用户定义变量。它还会按照字母顺序对结果进行排序。env和printenv命令同set命令的区别在于前两个命令不会对变量排序,也不会输出局部变量和用户定义变量。在这种情况下,env和printenv的输出是重复的。不过env命令有一个printenv没有的功能,这使得它要更有用一些。

设置用户定义变量

   可以在bash shell中直接设置自己的变量。下面将会介绍一些怎样在交互式shell或shell脚本程序中创建自己的变量并引用它们。

  设置局部用户定义变量

posted on 2020-06-04 13:49  Reverse-xiaoyu  阅读(293)  评论(0编辑  收藏  举报