十三、环境管理

1、环境变量

在 linux 系统下,如果你下载并安装了应用程序,很有可能在键入它的名称时出现“command not

found”的提示内容。如果每次都到安装目标文件夹内,找到可执行文件来进行操作就太繁琐了。这涉

及到环境变量 PATH 的设置问题,而 PATH 的设置也是在 linux 下定制环境变量的一个组成部分。

环境变量可以让子程序继续引用的原因,是因为:

1. 当启动一个 shell ,操作系统分配一记忆区块给 shell 使用,此区域之变量可以让子程序存

取;

2. 利用 export 功能,可以让变量的内容写到上述的记忆区块当中(环境变量);

当加载另一个 shell 时 (亦即启动子程序,而离开原本的父程序了),子 shell 3. 可以将父

shell 的环境变量所在的记忆区块导入自己的环境变量区块当中。

所以环境变量是和 Shell 紧密相关的,用户登录系统后就启动了一个 Shell。对于 Linux 来说一般

是 bash,但也可以重新设定或切换到其它的 Shell(使用 chsh 命令)。

根据发行版本的情况,bash 有两个基本的系统级配置文件:/etc/bashrc 和/etc/profile。这些配

置文件包含两组不同的变量:shell 变量和环境变量。前者只是在特定的 shell 中固定(如 bash),后

者在不同 shell 中固定。很明显,shell 变量是局部的,而环境变量是全局的。环境变量是通过 Shell

命令来设置的,设置好的环境变量又可以被所有当前用户所运行的程序所使用。对于 bash 这个 Shell

程序来说,可以通过变量名来访问相应的环境变量,通过 export 来设置环境变量。

注:Linux 的环境变量名称一般使用大写字母

1.1、 Linux环境变量的种类

按环境变量的生存周期来划分,Linux 的环境变量可分为两类:


1 永久的:需要修改配置文件,变量永久生效。


2 临时的:使用export命令行声明即可,变量在关闭shell时失效。

1.2、设置变量的三种方法


1 在/etc/profile文件中添加变量对所有用户生效(永久的)

用 VI 在文件/etc/profile 文件中增加变量,该变量将会对 Linux 下所有用户有效,并且是“永久

生效”。

例如:编辑/etc/profile 文件,添加 CLASSPATH 变量

# vi /etc/profile

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注 1:profile 文件在系统启动时将被运行。大家可以在里面加入其他命令,但是一定要加正确,不然

的话系统会启动不起来的。


2 在用户目录下的.bash_profile文件中增加变量对单一用户生效(永久的)

用 VI 在用户目录下的.bash_profile 文件中增加变量,改变量仅会对当前用户有效,并且是“永

久的”。

例如:编辑 guok 用户目录(/home/guok)下的.bash_profile

# vi /home/guok/.bash.profile添加如下内容:

export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib

注 2:如果修改了/etc/profile,那么编辑结束后执行 source profile 或 执行点命令 ./profile,PATH

的值就会立即生效了。这个方法的原理就是再执行一次/etc/profile shell 脚本,注意如果用 sh

/etc/profile 是不行的,因为 sh 是在子 shell 进程中执行的,即使 PATH 改变了也不会反应到当前环

境中,但是 source 是在当前 shell 进程中执行的,所以我们能看到 PATH 的改变。

注 3:变量重复定义时,以后面的设置为先。

例如:在 peofile 文件默认对 PATH 变量都有设置 PATH=¥¥¥¥¥¥¥,在以后可能在对 PATH 设

置,一般都加在 profile 文件的最后 PATH=······(打个比方)。而系统之中认定的

PATH=·······¥¥¥¥¥¥¥¥¥,也就是说相同名字的环境变量,后写入的先起作用(通俗地讲)。

注 4、特殊字符介绍。

例如在 profile 中有如下内容,通过以下内容说明特殊符号的用法。

export A=/q/jing:aaa/cc/ld

export B=.:/liheng/wang export A=/cd/cdr:$A

: 表示并列含义,例如 A 变量值有多个,用:符号进行分离。

. 表示你操作的当前目录。例如 pap 命令会查找 B 环境变量。

在/home 键入 B 命令,系统首先在/home 目录下(即当前路径)查找关于 B 的内容,如果没有在

/liheng/wang 目录下查找关于 B 的内容。 $ 表示该变量本次定义之前的值,例如$A 代表

/q/jing:aaa/cc/ld。也就是说 A=/cd/cdr:/q/jing:aaa/cc/ld

注 5、常见的环境变量

PATH:决定了 shell 将到哪些目录中寻找命令或程序

HOME:当前用户主目录

MAIL:是指当前用户的邮件存放目录。

SHELL:是指当前用户用的是哪种 Shell。

HISTSIZE:是指保存历史命令记录的条数。

LOGNAME:是指当前用户的登录名。

HOSTNAME:是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

LANG/LANGUGE:是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。

PS1:是基本提示符,对于 root 用户是#,对于普通用户是$。

PS2:是附属提示符,默认是“>”。可以通过修改此环境变量来修改当前的命令符,比如下列命令

会将提示符修改成字符串“Hello,My NewPrompt :) ”。

# PS1=" Hello,My NewPrompt :) "


3 直接运行export命令定义变量【只对当前shell(BASH)有效(临时的)】

在 shell 的命令行下直接使用[export 变量名=变量值]定义变量,该变量只在当前的 shell(BASH)或

其子 shell(BASH)下是有效的,shell 关闭了,变量也就失效了,再打开新 shell 时就没有这个变量,

需要使用的话还需要重新定义。

1.3、环境变量设置命令


1 echo $ <变量名> //显示某个环境变量


2 env

// environment (环境) 的简写,列出来所有的环境变量○

3 set

//显示所有本地定义的Shell变量,这个命令除了会将环境变量列出来之外,其它我们

的自定义的变量,都会被列出来。因此,想要观察目前 shell 环境下的所有变量,就用 set 即可!


4 export 命令

功能说明:设置或显示环境变量。

语 法:export [-fnp][变量名称]=[变量设置值]

补充说明:在 shell 中执行程序时,shell 会提供一组环境变量。export 可新增,修改或删除环

境变量,供后续执行的程序使用。export 的效力仅及于该此登陆操作。

参 数:

-f 代表[变量名称]中为函数名称。

-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。

-p 列出所有的 shell 赋予程序的环境变量。

一个变量创建时,它不会自动 地为在它之后创建的 shell 进程所知。而命令 export 可以向后面

的 shell 传递变量的值。当一个 shell 脚本调用并执行时,它不会自动得到原为脚本(调用者)

里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export 命令可以用于传递一

个或多个变量的值到任何后继脚本。


5 unset清除环境变量,如果未指定值,则该变量值将被设为NULL


6 readonly设置只读变量,只读变量设置后不能用unset清除,除非重启shell


7 declare 、typeset 这两个命令是完全一样的,他们允许指定变量的具体类型,在某些特定的语言

中,

这是一种指定类型的很弱的形式,declare 命令是在 Bash 版本 2 或之后的版本才被加入的,typeset

命令也可以工作在 ksh 脚本中。

[root@linux ~]# declare [-aixr] variable

参数:

-a :将后面的 variable 定义成为数组 (array)

-i :将后面接的 variable 定义成为整数数字 (integer)

-x :用法与 export 一样,就是将后面的 variable 变成环境变量;

-r :将一个 variable 的变量设定成为 readonly ,该变量不可被更改内容,也不能 unset

范例一:让变量 sum 进行 100+300+50 的加总结果

[root@linux ~]# sum=100+300+50

[root@linux ~]# echo $sum

100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!

[root@linux ~]# declare -i sum=100+300+50

[root@linux ~]# echo $sum

450

范例二:将 sum 变成环境变量

[root@linux ~]# declare -x sum

范例三:让 sum 变成只读属性,不可更动!

[root@linux ~]# declare -r sum

[root@linux ~]# sum=tesgting-bash: sum: readonly variable