Unix/Linux环境C编程入门教程(32) 环境变量那些事儿

原创 2014年07月22日 19:51:54

1. getenv() putenv()setenv()函数介绍


getenv(取得环境变量内容)

相关函数

putenv,setenv,unsetenv

表头文件

#include<stdlib.h>

定义函数

char * getenv(const char *name);

函数说明

getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。

返回值

执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。

范例

#include<stdlib.h>
mian()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER=%s\n”,p);
}

执行

USER = root

 


putenv(改变或增加环境变量)

相关函数

getenv,setenv,unsetenv

表头文件

#include4<stdlib.h>

定义函数

int putenv(const char * string);

函数说明

putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。

返回值

执行成功则返回0,有错误发生则返回-1。

错误代码

ENOMEM 内存不足,无法配置新的环境变量空间。

范例

#include<stdlib.h>
main()
{
char *p;
if((p = getenv(“USER”)))
printf(“USER =%s\n”,p);
putenv(“USER=test”);
printf(“USER+5s\n”,getenv(“USER”));
}

执行

USER=root
USER=root

 


setenv(改变或增加环境变量)

相关函数

getenv,putenv,unsetenv

表头文件

#include<stdlib.h>

定义函数

int setenv(const char *name,const char * value,int overwrite);

函数说明

setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。

参数

value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。

返回值

执行成功则返回0,有错误发生时返回-1。

错误代码

ENOMEM 内存不足,无法配置新的环境变量空间

范例

#include<stdlib.h>
main()
{
char * p;
if((p=getenv(“USER”)))
printf(“USER =%s\n”,p);
setenv(“USER”,”test”,1);
printf(“USER=%s\n”,getenv(“USEr”));
unsetenv(“USER”);
printf(“USER=%s\n”,getenv(“USER”));
}

执行

USER = root
USER = test
USER = (null)

2.Unix/Linux环境变量科普

    显示环境变量HOME

        

  设置一个临时的环境变量LANG,只要关闭了窗口环境变量就失效了

        使用env命令显示所有的环境变量

  使用set命令显示所有本地定义的Shell变量

  使用unset命令来清除环境变量

set可以设置某个环境变量的值。清除环境变量的值用unset命令。如果未指定值,则该变量值将被设为NULL。示例如下:

$ export TEST="Test..." #增加一个环境变量TEST

$ env|grep TEST #此命令有输入,证明环境变量TEST已经存在了

TEST=Test...

$ unset $TEST #删除环境变量TEST

$ env|grep TEST #此命令没有输出,证明环境变量TEST已经存在了

 使用readonly命令设置只读变量

  如果使用了readonly命令的话,变量就不可以被修改或清除了。示例如下:

$ export TEST="Test..." #增加一个环境变量TEST

$ readonly TEST #将环境变量TEST设为只读

$ unset TEST #会发现此变量不能被删除

-bash: unset: TEST: cannot unset: readonly variable

1.Linux的变量种类

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

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

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

2.设置变量的三种方法

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

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

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

# vi /etc/profile

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

注:修改文件后要想马上生效还要运行# source/etc/profile不然只能在下次重进此用户时生效。

b 修改/etc/bashrc

在执行完/etc/profile 内容之后,如果用户的SHELL 运行的是bash ,那么接着就会执行此文件。另外,当每次一个新的bash shell 被打开时, 该文件被读取。

   每个使用bash 的用户在登陆以后执行完/etc/profile 中内容以后都会执行此文件,在新开一个bash 的时候也会执行此文件。因此,如果你想让每个使用bash 的用户每新开一个bash 和每次登陆都执行某些操作,或者给他们定义一些新的环境变量,就可以在这个里面设置。

 

c~/.bash_profile文件中增加变量【对单一用户生效(永久的)

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

$ vi /home/itcast/.bash.profile

  修改成内容:

        

  注:修改文件后要想马上生效还要运行

source /home/itcast/.bash_profile . /home/itcast/.bash_profile

 不然只能在下次重进此用户时生效。

d 修改~/.bashrc

该文件包含专用于单个人的bash shell bash 信息,当登录时以及每次打开一个新的shell , 该该文件被读取。

   单个用户此文件的修改会影响到他以后的每一次登陆系统和每一次新开一个bash 。因此,可以在这里设置单个用户的特殊的环境变量或者特殊的操作,那么每次它新登陆系统或者新开一个bash ,都会去获取相应的特殊的环境变量和特殊操作。

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

  在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。

        

 

3.实战演练

 

流程设计


首先我们输入一个我们想要查询的环境变量

显示完成之后

利用getenv()函数实现一个whoami命令的功能

setenv设置系统有的USER环境变量并查看

setenv设置系统没有的USE环境变量并查看

putenv设置USER环境变量并查看

然后删除USER环境变量并查看

然后我们设置一个环境变量

 

源代码实现:

	#include <stdio.h>
	#include <stdlib.h>
 
	int main(void)
	{
 	//char * getenv(const char *name);
	 //int putenv(const char * string);
	 //int setenv(const char *name,const char * value,int overwrite);
 	  char envName[32];
  	 printf("\n");
   	 printf("请输入你想要查询的环境变量:\n");
   	 scanf("%s",envName);
   	 printf("%s\n",getenv(envName));
 
 
  	 printf("开始查看USER环境变量 = %s\n",getenv("USER"));
  	 setenv("USER","SETENV1",1); //如果USER环境变量被设置过就设置
 	 printf("设置USER环境变量完成\n");
	 setenv("USE","SETENV0",0); //如果没有被设置过 就设置
    	 printf("设置USE环境变量完成\n");
   	printf("查看USE环境变量 = %s\n",getenv("USE"));
 
 
   	putenv("USER=test");
 	  printf("设置USER环境变量完成\n");
  	 printf("USER=%s\n",getenv("USER"));
 	
 	  unsetenv("USER");
 	  printf("去除USER环境变量完成\n");
  	 printf("USER=%s\n",getenv("USER"));
  	 return 0;
	}
 
 


 

4各个平台的运行情况

在RHEL7上


在RHEL6上