shell中的变量可以简单分为环境变量和自定义变量。环境变量有时也被称为全局变量,它是操作系统为Shell事先定义的一组变量,这些变量共同描述了当前shell运行的系统环境;而自定义变量则是用户根据所需而定义的变量,它也被称为局部变量。自定义环境变量可以为局部的也可为全局的,为了区分两者的不同,环境变量通常用大写字母表示,而自定义变量通常使用小写子母表示。
1. 环境变量
环境变量是一组变量的集合,它们描述了当前shell运行的环境信息。最典型的环境变量即为PATH,它描述了可执行文件的路径信息。通过env命令可以查看当前shell环境下所有环境变量及其对应的值。
env
下面对部分环境变量做以解释:
HOME:表示当前用户的主目录。当输入cd或cd ~命令时,就会用到这个变量,如果更改了这个变量的值,那么使用上述命令的结果也会相应的改变。
SHELL:表示当前的shell环境所使用的shell程序。常见的shell程序有/bin/bash和/bin/sh,Linux中默认使用的是/bin/bash。
PWD:shell当前所在的工作目录,这个变量的值是通过pwd命令得到的。
USER:当前的用户名。
2. 自定义变量
shell除了环境变量,还包括用户自定义的变量。env命令查看的只是所有环境变量,而set命令既可以查看环境变量也可以查看自定义变量。
set
3. 环境变量和自定义变量之间的转换
环境变量在Linux下的shell程序默认为bash,因此每一个bash其实都是一个进程,在当前bash下输入ps命令则可以查看该bash的PID。对于环境变量而言,每个bash进程都可以对其进行引用;而对于用户自定义的变量,只有对其定义的bash进程可以引用它,其他的bash进程甚至是其子进程均不可以引用。这也是环境变量和自定义变量的的主要区别之一。
从进程内存映像的结构分布可以很好的解释环境变量和自定义变量之间的差异。在Linux系统中,所有的bash进程都是gnome-terminal进程的孩子或孙子,而gnome-terminal进程是由init进程创建的,由于环境变量保存在gnome-terminal进程的数据段,因此它的孩子或孙子(即Bash进程的孩子)均可以继承数据段的数据,即所有bash进程都可以访问环境变量。对于自定义变量而言,它位于每个bash进程的栈中,而每个进程它都有自己独立的段,因此自定义变量是不能被继承的,即自定义变量不能被其他bash进程引用。
那么,环境变量和自定义变量之间如何相互转换呢?通过export命令和declare命令即可完成。如果要将一个自定义变量转化为环境变量,示例如下:
NAME=name1
export NAME
env | grep NAME
此时会看到NAME已经成为环境变量,但是是局部的,换个终端便查不到NAME,设置为全局的可以在/etc/profile中进行设置: export NAME=name1
如果要将环境变量转化为自定义变量,则需使用下述命令:
declare +x NAME
env | grep NAME
此时不会再显示NAME
关于exprot和declare命令更多的用法,可以参考man手册。