十三、环境管理
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