辛星浅谈Linux中的环境变量


全局变量和本地环境变量:

bash shell使用一种称为环境变量的特性来存储关于shell会话和工作环境的信息,这也是环境变量的名字的由来。该特性还允许我们把数据存储在内存中,以便于在shell中运行的程序或者脚本中访问它们。bash shell中共有两种类型的环境变量:全局变量和本地变量。

全局环境变量在shell会话和该shell产生的任何子进程中都可见。而本地变量则只在创建它们的shell中可见。在产生需要父进程信息的子进程的应用程序中,这便体现了全局变量的重要作用。系统环境变量使用使用全大写字母来区别于普通用户环境变量。我们使用printenv命令来查看全局环境变量。要查看某个全局变量的值,我们可以使用echo命令,但是在引用某个环境变量名称的时候,我们需要添加一个美元符号,比如echo $HOME来查看家目录。没有任何命令可以只显示本地环境变量,我们可以使用set命令来显示特定进程的所有环境变量集,这其中也包括了全局环境变量。也就是说我们的printenv命令所看到的所有的全局变量都出现在了set命令的输出中。

设置本地环境变量:

我们可以创建在shell进程中可见的本地变量。我们可以为环境变量分配一个数值或者一个字符串,方法是使用等号将变量指定为具体值,比如test=xin,然后我们使用echo $test就可以输出该变量值了。如果我们要指定包含空格的字符串值,我们需要使用单引号来括起来指定字符的起始位置。如果我们没有使用单引号,bash shell将假定下一个字符是另一个命令。

我们bash shell中的一个约定就是,如果创建新环境变量,建议使用小写字母。它有助于我们区分个人环境变量与系统环境变量。

需要注意的是,环境变量名称、等号和值之间不能有空格,这一点很重要,如果我们在其中添加了任何的空格,那么bash shell会把值解释为一个单独的命令。

我们设置了本地变量之后,我们可以在shell进程的任何地方使用它。但是,如果产生了另外一个shell,则不能在子shell中使用它,我们可以用exit来退出子shell,返回到父shell,当然我们可以用bash来进入一个子shell。

设置全局环境变量:

全局环境变量在任何由设置全局环境变量的进程创建的子进程中都可见。创建全局环境变量的方法是创建一个本地环境变量,然后使用export来把它到处到全局环境中。比如我们首先>test=xin,然后>export test。

这里的export命令让它具有了全局性,在导出本地环境变量时,我们不必使用美元符号来引用变量的名称。

移除环境变量:

我们使用unset来移除环境变量,操作范例unset test,注意这里不要使用美元符号。在操作全局环境变量时,如果我们在子进程中使用unset移除全局环境变量,则该操作只对子进程有效,全局环境变量在父进程中依然可用。

默认的shell环境变量:

(1)CDPATH 冒号分割的目录列表,用作cd命令的搜索路径

(2)HOME 当前用户的主目录

(3)IFS 用于分割字段的字符列表,shell使用它们分割文本字符串

(4)MAIL 当前用户邮箱的文件名,对于新邮件,bash shell将检查该文件

(5)MAILPATH 当前用户邮箱的多个文件名,由冒号分割,对于新邮件,bash shell将检查该列表中的各个文件

(6)OPTARG getopts命令处理的最后一个选项参数的值

(7)OPTIND getopts命令处理的最后一个选项参数的索引值

(8)PATH 冒号分隔的目录列表,shell将在这些目录中查找命令

(9)PS1 主shell命令行界面提示字符串

(10)PS2 次shell命令行界面提示字符串

设置PATH环境变量:

(1)注意:PATH还显示了shell查找命令的顺序

(2)比如我们在PATH中追加一个目录,我们可以使用如下的格式范例:PATH=$PATH:/home/xin/test

(3)我们把某些命令的目录追加到PATH环境变量中,我们可以在虚拟目录结构的任何位置执行我们的程序。

(4)我们经常用的一个技巧就是在我们的PATH环境变量中包括一个点符号,这个点符号代表当前目录。

定位系统环境变量:

通过登录Linux系统启动bash shell时,bash默认将检查一些文件以执行命令,这些文件被称为启动文件。bash处理的启动文件依赖于启动bash shell的方法,我们可以用三种方法来启动bash shell:①在登录时作为默认登录shell。②作为非登录shell的交互式shell。③作为非交互式shell运行脚本。

登录shell:

登录shell将查找四个不同的启动文件来处理当前的命令:/etc/profile、$HOME/.bash_profile、$HOME/.bash_login、$HOME/.profile

其中/etc/profile文件是bash shell在系统上的主默认启动文件,系统上的每一个用户在登录时都将执行此启动文件,另外三个启动文件特定于各个用户,并且可以根据各用户的需求自定义它们。当我们登录Linux操作系统时,bash将执行/etc/profile启动文件中的命令。我们还注意到该文件中会export很多的变量为全局变量。

profile文件还使用了另外一个技巧性的特性,那就是能够迭代/etc/profile.d目录中的任何文件的for语句,这使得Linux系统提供了一个放置特定于应用程序的启动文件,这些文件将在我们登录时由shell执行。

对于$HOME目录下的三个文件,它们具有相同的功能,它们提供特定于用户的启动文件,用于定义特定于用户的环境变量,大多数Linux发行版都是使用三者之一,也就是.bash_profile或者.bash_login或者.profile,注意它们三个都是以点号开头,表示它们是隐藏文件,不会显示在普通的ls命令清单中。

交互式shell:

如果启动了一个bash shell而没有登录系统,比如说只在cli提示符中键入bash,则我们启动的就是一个交互式shell,交互式shell与登录shell的行为不同,但是它仍然提供了一个cli提示符来供我们输入命令。

如果bash作为交互式shell启动,它不会处理/etc/profile文件,相反,它会检查用户HOME目录中的.bashrc文件。而.bashrc文件执行两个任务:①首先检查/etc目录中的公共bashrc文件。②为用户输入个人别名和私有脚本函数提供了地方。

而公共/etc/bashrc文件由系统上启动了交互式shell会话的任何人运行。默认文件将设置一些环境变量,但是它没有使用export命令将它们设置为全局性质。请记住,每次启动新交互式shell时都会运行交互式shell启动文件,因此,任何子shell都会自动执行交互式shell启动文件。其中我们也会注意到,/etc/bashrc文件也执行了位于/etc/profile.d目录中的、特定于应用程序的启动文件。

非交互式shell:

它是系统开始执行shell脚本的shell。它的不同之处在于不用担心cli提示符,但是我们仍然希望在每次启动系统中的脚本时运行特定的启动命令。

bash shell提供了BASH_ENV环境变量,当shell开始一个非交互式shell进程时,它将检查该环境变量中表示的待执行启动文件的名称。如果该变量有值,则shell将执行该文件中的命令。

变量数组:

环境变量的一个非常好地特性就是能够当做数组使用,数组是能够保存多个值的变量,数组中的值既可以分别使用,也可以作为整体引用。

要为某个环境变量设置多个值,我们只需要将它们列出在圆括号中,各个值以空格分割,比如>xin=(one two three four five) 不过当我们使用>echo $xin的时候却只会显示数组的第一个值。

如果我们要引用某个单独的数组元素,我们必须使用一个数值索引值,它表示该元素在数组中的位置,索引值放在方括号中,比如:echo ${xin[2]},这里需要注意的是,环境变量数组的索引值从0开始。当然我们也可以在中括号中使用星号通配符来查看所有值,比如echo ${xin[*]}。

我们还可以更改某个索引位置的值,比如xin[2]=star,当然我们还可以使用unset来移除数组中的某个值,比如unset xin[2],当然我们也可以用unset xin来移除整个数组。

相关内容