环境变量表--extern char **environ;

每个程序都有一个环境表,它是一个字符指针数组,其中每个指针包含一个以NULL结尾的C字符串的地址。全局变量environ则包含了该指针数组的地址:

extern char **environ;

简单打印环境变量表:

#include<stdio.h>
 
extern char **environ;
 
int main()
{
  int i;
 
  for(i = 0; *environ[i]; i++)
    printf("*environ[%d]: %s\n", i, environ[i]);
 
  return 0;
}

结果:

h180 c # ./a.out
*environ[0]: ORBIT_SOCKETDIR=/tmp/orbit-root
*environ[1]: SSH_AGENT_PID=3471
*environ[2]: GPG_AGENT_INFO=/tmp/seahorse-I1EsFP/S.gpg-agent:3493:1
*environ[3]: TERM=xterm
*environ[4]: SHELL=/bin/bash
*environ[5]: XDG_SESSION_COOKIE=4f027cabadbf93d36492b7424b4a1694-1264793154.856694-819590398
*environ[6]: GTK_RC_FILES=/etc/gtk/gtkrc:/root/.gtkrc-1.2-gnome2
*environ[7]: WINDOWID=65074553
*environ[8]: GTK_MODULES=canberra-gtk-module
*environ[9]: USER=root
*environ[10]: GNOME_KEYRING_SOCKET=/tmp/keyring-NBsJ8W/socket
*environ[11]: SSH_AUTH_SOCK=/tmp/ssh-cvNttB3314/agent.3314
*environ[12]: SESSION_MANAGER=local/h180:/tmp/.ICE-unix/3314
*environ[13]: USERNAME=root
*environ[14]: DESKTOP_SESSION=default
*environ[15]: PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/pgsql/bin
*environ[16]: QT_IM_MODULE=ibus
*environ[17]: GDM_XSERVER_LOCATION=local
*environ[18]: PWD=/root/c
*environ[19]: XMODIFIERS=@im=ibus
*environ[20]: LANG=en_US.UTF-8
*environ[21]: GNOME_KEYRING_PID=3301
*environ[22]: GDM_LANG=en_US.UTF-8
*environ[23]: GDMSESSION=default
*environ[24]: XMODIFIER=@im=ibus
*environ[25]: SHLVL=1
*environ[26]: HOME=/root
*environ[27]: GNOME_DESKTOP_SESSION_ID=this-is-deprecated
*environ[28]: LOGNAME=root
*environ[29]: XDG_DATA_DIRS=/usr/local/share/:/usr/share/:/usr/share/gdm/
*environ[30]: DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-Lp35w5OCn7,guid=59991196229b67f06e7bd0314b633646
*environ[31]: WINDOWPATH=7
*environ[32]: DISPLAY=:0.0
*environ[33]: GTK_IM_MODULE=ibus
*environ[34]: XAUTHORITY=/root/.Xauthority
*environ[35]: COLORTERM=gnome-terminal
*environ[36]: OLDPWD=/usr/include
*environ[37]: _=./a.out
Segmentation fault (core dumped)

getenv

函数名: getenv
功 能: 从环境中取字符串,获取环境变量的值
头文件: stdlib.h
用 法:char *getenv(char *envvar);
函数说明:getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。getenv函数的返回值存储在一个全局二维数组里,当你再次使用getenv函数时不用担心会覆盖上次的调用结果。
返回值: 执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。如果变量存在但无关联值,它将运行成功并返回一个空字符串,即该字符的第一个字节是null。
相关函数:_wgetenv、getenv_s、_wgetenv_s

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

extern char **environ;

char *my_getenv(const char *name)
{
	char *p = NULL;
	int i, len;

	for(i = 0; environ[i] != NULL; i++){
		p = strstr(environ[i], "=");
		len = p - environ[i];
		if(strncmp(name, environ[i], len) == 0){
			return p+1;
		}
	}

	return NULL;
}

int main(int argc, char *argv[])
{
	char *p = NULL;

	p = getenv(argv[1]);
	//p = my_getenv(argv[1]);

	if(p == NULL)
		printf("there is no match\n");
	else
		printf("%s\n", p);

	return 0;
}



setenv unsetenv

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	char *val;
	const char *name = "ABD";

	val = getenv(name);
	printf("1, %s = %s\n", name, val);

	setenv(name, "haha-day-and-night", 1);

	val = getenv(name);
	printf("2, %s = %s\n", name, val);

#if 1
	int ret = unsetenv("ABD=");
    printf("ret = %d\n", ret);

	val = getenv(name);
	printf("3, %s = %s\n", name, val);

#else
	int ret = unsetenv("ABD");  //name=value:value
	printf("ret = %d\n", ret);

	val = getenv(name);
	printf("3, %s = %s\n", name, val);

#endif

	return 0;
}

一、环境变量

1.概念
指在操作系统中用来指定操作系统运行环境的一些参数。环境变量通常具有特殊用途,在系统中具有全局特性。
环境变量通常具有全局属性,可以被子进程继承下去。

2.常见的环境变量
(1)PATH:指定命令的搜索路径
(2)HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
(3)HISTSIZE:指保存历史命令记录的条数
(4)SHELL:当前Shell,它的值通常是/bin/bash

3.查看环境变量的方法
echo $NAME //NAME:环境变量名称

4.和环境变量相关的命令
(1)echo:显示某个环境变量值
(2)export:设置一个新的环境变量
(3)env:显示所有环境变量
(4)unset:清楚环境变量
(5)set:显示本地定义的shell变量和环境变量

二、setenv

作为setenv函数
作用:增加或者修改环境变量。
注意:通过此函数并不能添加或修改 shell 进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了setenv函数,进程终止后再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的。
头文件:#include<stdlib.h>
注:stdlib.h在Linux和Windows中略不同,比如setenv函数是用在linux中的,在Windows中没有setenv函数而用putenv来代替
函数声明:int setenv(const char *name,const char * value,int overwrite);
函数说明:setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。参数 value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果没有此环境变量则无论overwrite为何值均添加此环境变量。若环境变量存在,当overwrite不为0时,原内容会被改为参数value所指的变量内容;当overwrite为0时,则参数value会被忽略。返回值 执行成功则返回0,有错误发生时返回-1。
相关函数:getenv,putenv,unsetenv

作为Linux中setenv命令
Linux中的功能:查询或显示环境变量
语法:setenv [变量名称] [变量值]

setenv用于在C shell设置环境变量的值
用法:setenv ENVVAR value
ENVVAR 为所要设置的环境变量的名。value为所要设置的环境变量的值
例:setenv PATH "/bin:/usr/bin:usr/sbin:"设置环境path的搜索路径为/bin,/usr/bin以及/usr/sbin

三、export

Linux中的功能:设置或显示环境变量(比如我们要用一个命令,但这个命令的执行文件不在当前目录,这样我们每次用的时候必须制定执行文件的目录,麻烦,在代码中先执行export,这个相当于告诉程序,执行某某东西时,需要的文件或什么东西在这些目录里)
说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该次登陆操作。
语法:export [-fnp] [变量名称] = [变量设置值]
参数说明:

-f  代表[变量名称]中为函数名称。
-n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p  列出所有的shell赋予程序的环境变量。
延伸:export设置环境变量是暂时的,只在本次登录中有效,可修改如下文件来使命令长久有效。
注意:
1、执行脚本时是在一个子shell环境运行的,脚本执行完后该子shell自动退出;
2、一个shell中的系统环境变量才会被复制到子shell中(用export定义的变量);
3、一个shell中的系统环境变量只对该shell或者它的子shell有效,该shell结束时变量消失(并不能返回到父shell中)。
4、不用export定义的变量只对该shell有效,对子shell也是无效的。

一个变量创建时,它不会自动的为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原来脚本(调用者)里定义的变量的访问权,除非这些变量已经被显示地设置为可用。export命令可以用于传递一个或多个变量的值到任何后续脚本。

export设置环境变量是暂时的,只在本次登录中有效,若想要使得开机时自动加载这个环境变量免除以后每次设置,可将其写入/etc/re.local

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值