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。
局部环境变量
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脚本程序中创建自己的变量并引用它们。