Linux环境变量编程
一、Linux系统环境变量的分类
按变量的生存周期来划分,Linux变量可分为两类:
==环境变量==:又称为全局变量,存在于所有的Shell中;它是永久生效的,且具有继承性,即子Shell会继承父Shell的环境变量;
==本地变量==:当前Shell中的变量,很显然本地变量中肯定包含环境变量;Linux本地变量的非环境变量不具备继承性。
二、Linux系统环境变量相关的文件
当你进入系统的时候,Linux就会为你读入系统的环境变量,这些环境变量都存放在不同的环境变量文件中,Linux系统按如下顺序读取环境变量文件来录入环境变量。
2.1 系统环境变量:/etc/profile
此文件为系统的环境变量,它为每个用户设置环境信息,当用户第一次登陆时,该文件被执行,并从/etc/profile.d目录的配置文件中搜索shell的设置。这个文件是任何用户登录操作系统以后都会读取的文件(如果用户的shell是csh、tcsh、zsh,则不会读取此文件),用于获取系统的环境变量,只在登录的时候读取一次。
2.2 /etc/bashrc
在执行完/etc/profile内容之后,如果用户的Shell运行的是bash,那么接着读取/etc/bashrc文件。另外,当每次一个新的bash shell被打开时,该文件被读取一次。因此,如果想让每个使用bash的用户每新开一个bash和每次登录都执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。
2.3 用户环境变量~/.bash_profile
每个用户都可以使用该文件传入专用于自己使用的shell信息。当用户登录时,该文件仅仅执行一次,默认情况下,它设置一些环境变量,执行用户的.bashrc文件。对单个用户目录下此文件的修改,只会影响到该用户以后每一次登录系统。因此,可以在这里设置单个用户的特殊环境变量或特殊操作。
2.4 ~/.bashrc
该文件包含专用于单个人的bash shell的bash信息,当登录时以及每次打开一个新的shell时,该文件被读取。单个用户对此文件的修改会影响到他以后的每一次登录系统和每一次新打开一个bash。因此,可以在这里设置单个用户的特殊环境变量或者特殊操作。
2.5 ~/bash_logout
当用户每次退出系统(退出bash shell)时,执行该文件。
三、Linux系统常用的环境变量
在Linux系统中,常见的环境变量及其含义如下所示:
- PS1 : 基本提示符,对于root是#,对于普通用户是$。
- MAIL : 当前用户的邮件存放目录;
- PATH : 决定了Shell将到哪些目录中寻找命令或程序;
- HOME : 当前用户主目录;
- SHELL : 当前用户Shell类型;
- HISTSIZE : 历史记录数;
- LOGNAME : 当前用户的登录名;
- LANGUGE : 语言相关的环境变量,多语言可以修改此环境变量;
- HOSTNAME : 指主机的名称;
四、Linux环境变量修改方法
4.1 修改/etc/profile文件
用VI在文件==/etc/profile==中添加、删除或修改变量,该变量将会对Linux下所有用户有效,并且是永久的。
注意:在修改完成该文件后,必须运行“# source /etc/profile”之后才能生效,否则只能下次登录时才生效。
4.2 修改~目录下的.bash_profile文件
用VI在用户目录下的==.bash_profile==文件中添加、删除或修改变量,该变量仅会对当前用户有效,并且是永久的;
注意:在修改完成该文件后,必须运行“# source /etc/profile”之后才能生效,否则只能下次登录时才生效。
4.3 使用export命令设置环境变量
在Shell的命令行下直接使用如下方式定义变量:
==$ export 变量名=变量值==
该变量只在当前的Shell(BASH)或其子Shell(BASH)下是有效的,Shell关闭了,变量也就失效了,再打开新Shell时就没有这个变量,需要使用的话还需要重新定义。
$ export HELLO=”hello!”
$ echo $HELLO
hello!
五、通过命令方式修改环境变量
5.1 使用echo命令查看单个环境变量
查看一个指定的环境变量。
$ echo $PATH
/usr/lib/qt-3.3/bin:/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/home/study/bin:/bin/3.4.5/bin
5.2 使用env/printenv命令查看所有环境变量
用于打印所有的环境变量。
$ env
HOSTNAME=localhost.localdomain
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
KDE_NO_IPV6=1
SSH_CLIENT=192.168.6.9 58178 5200
QTDIR=/usr/lib/qt-3.3
QTINC=/usr/lib/qt-3.3/include
SSH_TTY=/dev/pts/1
USER=study
……
5.3 使用set查看所有本地定义的环境变量
用于显示与设置当前本地变量。单独使用set,就显示了当前环境的所有的变量,它肯定包括环境变量和一些非环境变量。
$ set
BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()
BASH_VERSINFO=([0]="3" [1]="2" [2]="25" [3]="1" [4]="release" [5]="i686-redhat-linux-gnu")
BASH_VERSION='3.2.25(1)-release'
COLORS=/etc/DIR_COLORS.xterm
COLUMNS=131
……
5.4 使用unset删除指定的环境变量
用于清除变量,不管这个变量是环境变量还是本地变量,它都可以清除。如果未指定值,则该变量的值被设为NULL。
$export HELLO=”hello”
$ unset HELLO
#echo $HELLO
5.5 使用export命令改变环境变量
用于把变量变成当前shell和其子shell的环境变量,其存活期是当前的shell及其子shell,因此重新登陆后,它所设定的环境变量就消失了。要想环境变量永久化,那就修改第二节介绍的几个环境变量配置文件。
5.6 使用readonly命令设置只读环境变量
如果使用了readonly命令的话,变量就不可以被修改或清除了。
$ export TEST=”Test…”
$ readonly TEST
$ unset TEST
-bash: unset: Test: cannot unset: readonly variable
$ TEST=”New”
-bash: TEST: readonly variable
5.7 使用source命令让脚本在当前shell中执行
当直接执行一个脚本的时候,其实是在一个子shell环境运行的,即开启了一个子shell来执行这个脚本,脚本执行完后,该子shell自动退出。当然,我们也可以使用source命令让脚本在当前的shell中执行。如:
$ cat test.sh #查看脚本内容
echo $myname
$ echo $myname #查看变量
ilonng
$ set | grep myname #变量是本地变量
myname=ilonng
$ env | grep myname #变量不是环境变量
$ sh test.sh #新开子shell执行,非环境变量的本地变量不具备继承性,在子shell中不可见
#什么也没有输出
六、通过系统调用方式修改环境变量
在编写Linux应用程序的过程中,应用程序常常会使用到Linux系统的一些环境变量,因此需要从系统中去获取系统环境变量;但有时一个应用程序使用的自己配置的环境变量(如子进程的环境与父进程的环境不同),则需要修改本程序的环境变量。本篇文章主要介绍如何从系统获取系统环境变量和如何设置本程序的环境变量(<font color="dd0000">不影响系统的环境变量</font>)的函数的使用:getenv()、putenv()、setenv()、unsetenv()。
使用以上几个函数需包含如下头文件:
#include <stdlib.h>
6.1 获取系统环境变量:getenv()
【函数定义】:char *getenv(const char *name);
【函数说明】:getenv()用来取得参数name环境变量的内容;
【参数说明】:name为环境变量的名称,环境变量的格式为name=value;如果该变量存在则会返回指向该环境变量值的指针,即指向value的指针;如果该变量不存在,则返回NULL指针;
【返回值】:执行成功返回指向该环境变量的值的指针,找不到符合的环境变量名称则返回NULL;
【范 例】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
p = getenv("PATH");
if(p == NULL)
{
printf("Get env failed.\n");
return -1;
}
printf("PATH=%s\n",p);
return 0;
}
6.2 改变/增加环境变量:putenv()
【函数定义】:char *putenv(const char *string);
【函数说明】:putenv()用来改变或增加环境变量的内容;
【参数说明】:string的格式为“name=value”,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量;
【错误代码】:ENOMEM,内存不足,无法配置新的环境变量空间;
【返回值】:执行成功返回0,有错误发生返回-1;
【范 例】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ret;
char *p;
p = getenv("DB_HOME");
if(p == NULL)
{
printf("Getenv failed.\n");
return -1;
}
printf("DB_HOME=%s\n",p);
ret = putenv("DB_HOME=/opt/www/cgi-bin/");
if(ret != 0)
{
printf("Putenv failed.\n");
return -1;
}
p = getenv("DB_HOME");
if(p == NULL)
{
printf("Getenv failed.\n");
return -1;
}
printf("After putenv:DB_HOME=%s\n",p);
return 0;
}
6.3 改变/增加环境变量:setenv()
【函数定义】:char *setenv(const char *name,const char *value,int overwrite);
【函数说明】:setenv()用来改变或增加环境变量的内容;
【参数说明】:name:为环境变量名称字符串;value:为环境变量的内容;overwrite:用来决定是否要改变已存在的环境变量:如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容;如果overwrite为0,且该环境变量已有内容,则参数value会被忽略;
【错误代码】:ENOMEM,内存不足,无法配置新的环境变量空间;
【返回值】:执行成功返回0,有错误发生返回-1;
【范 例】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int ret;
char *p;
p = getenv("PATH");
if(p == NULL)
{
printf("Getenv failed.\n");
return -1;
}
printf("PATH=%s\n",p);
ret = setenv("PATH","/bin/:/sbin/:/user/sbin/:/user/bin/:/opt/cst_app/bin/",1);
if(ret < 0)
{
printf("Setenv failed.\n”");
return -1;
}
printf("Setenv OK.\n");
p = getenv("PATH");
if(p == NULL)
{
printf("Getenv failed.\n");
return -1;
}
printf("PATH=%s\n”",p);
return 0;
}
6.4 删除一个环境变量:unsetenv()
【函数定义】:char *unsetenv(const char *name);
【函数说明】:unsetenv()用来删除name定义的环境变量,即使不存在也不算出错;
【参数说明】:name为要删除的环境变量的名称;
【返回值】:执行成功返回0,有错误发生返回-1;
【范 例】:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char *p;
p = getenv("PATH");
if(p == NULL)
{
printf("Get env failed.\n");
return -1;
}
printf("PATH=%s\n",p);
unsetenv("PATH");
p = getenv("PATH");
if(p == NULL)
{
printf("Get env failed.\n");
return -1;
}
printf("PATH=%s\n",p);
return 0;
}