环境变量 linux,linux下,关于环境变量
环境变量
我们在第二章讨论了环境变量。这些变量可以用来控制shell脚本和其他程序的形状。我们还可以使用它们来配置用户环境。例如,每个用户都有一个环境变量HOME,它将其用户主目录定义为会话的开始位置。众所周知,shell提示我们测试环境变量:
$ echo $HOME
/首页/尼尔
我们还可以使用shell的set命令来列出所有的环境变量。
Unix描述定义了许多用于各种目的的标准环境变量,包括终端类型、默认编辑器、时区等等。C程序可以使用putenv和getenv函数来访问环境变量。
#包含stdlib.h
char * getenv(const char * name);
int putenv(const char * string);
环境由名称=值形式的字符串组成。Getenv函数查找由名称指定的环境,并返回与之相关的值。如果请求的变量不存在,它将返回null。如果变量存在但没有值,getenv函数将成功返回第一个字节为空的字符串。getenv函数返回的变量存储在getenv提供的语句存储区,不能被程序覆盖,因为会被getenv的序列调用覆盖。
putenv函数的参数是name=value格式的字符串,它被添加到当前环境中。如果环境由于缺少可用内存而无法扩展,函数调用将失败并返回-1。如果发生这种情况,错误变量errno将被设置为ENOMEM。
让我们写一个程序来打印出我们选择的任何环境变量的值。如果我们的程序指定了第二个参数,我们也可以设置它的值。
测试-getenv和putenv
main函数声明后的行确保程序environ.c被正确调用:
#包含stdlib.h
#包含stdio.h
#包含字符串. h
int main(int argc,char *argv[])
{
char *var,* value
if(argc==1 argc 3) {
fprintf(stderr," usage:environ var[value]/n ");
出口(1);
}
2这样做之后,我们使用getenv函数从环境中获取变量的值:
var=argv[1];
value=getenv(var);
如果(值)
printf("变量%s有值%s/n ",var,value);
其他
printf("变量%s没有值/n ",var);
3接下来,我们将检查程序调用是否指定了第二个参数。如果指定了第二个参数,我们以组合名称=值的形式将变量设置为参数值,然后调用putenv:
if(argc==3) {
char * string
value=argv[2];
string=malloc(strlen(var)strlen(value)2);
如果(!字符串){
fprintf(stderr,"内存不足/n ");
出口(1);
}
strcpy(string,var);
strcat(字符串,"=");
strcat(字符串,值);
printf("用:%s/n "调用putenv ",string);
if(putenv(string)!=0) {
fprintf(stderr," putenv failed/n ");
免费(字符串);
出口(1);
}
4.最后,我们通过再次调用getenv函数来测试新的变量值:
value=getenv(var);
如果(值)
printf("新的%s值是%s/n ",var,value);
其他
printf("新的%s值为空?/n ",var);
}
退出(0);
}
如果我们运行这个程序,我们可以得到以下程序输出:
$ ./环境家园
变量HOME有值/home/neil
$ ./环境弗雷德
变量FRED没有值
$ ./environ弗雷德你好
变量FRED没有值
使用以下命令调用putenv:FRED=hello
弗雷德的新价值是你好
$ ./环境弗雷德
变量FRED没有值
注意,环境对我们的程序来说只是部分可见的。我们在程序内部所做的更改不会反映到程序外部,因为变量值不会从子进程(我们的程序)传递到父进程(shell)。
使用环境变量
程序通常使用环境变量来改变它们的工作方式。用户可以用各种方式更改环境变量,或者通过修改。我们的登录shell在其默认环境中读取的配置文件,或者使用特定于shell的启动文件(rc),或者在shell命令行上指定变量。例如:
$ ./环境弗雷德
变量FRED没有值
$ FRED=你好。/环境弗雷德
变量弗雷德有值你好
shell的初始变量赋值被用作环境变量的临时变化。在上面的第二个例子中,程序environ运行在变量FRED有值的环境中。
例如,在我们的CD数据库程序的未来版本中,我们将更改一个环境变量CDDB来指定要使用的数据库。每个用户都可以指定自己的默认值,或者使用shell命令来设置它们:
$ CDDB=mycds导出CDDB
$ cdapp
或者
$ CDDB=mycds cdapp
环境变量
正如我们所看到的,程序环境由格式为name=value的字符串组成。这个字符串数组直接通过environ变量提供给程序,它的声明是:
#包含stdlib.h
外部字符* *环境;
实验环境
下面是一个showenv.c程序,它使用environ变量来打印环境变量:
#包含stdlib.h
#包含stdio.h
外部字符* *环境;
int main()
{
char * * env=environ
while(*env) {
printf("%s/n ",* env);
env
}
退出(0);
}
当我们在Linux系统上运行这个程序时,我们将得到类似下面的输出,其中有很多缩写。这些变量的数量、它们出现的顺序以及它们的值取决于操作系统版本、使用的命令shell以及程序运行时的用户设置:
$ ./showenv
HOSTNAME=tilde.provider.com
LOGNAME=neil
MAIL=/var/spool/mail/neil
术语=控制台
主机类型=i386
PATH=/usr/local/bin:/bin:/usr/bin:
HOME=/usr/neil
LS _ OPTIONS=—8 bit—color=tty-F-T 0
SHELL=/bin/bash
PS1=/h:/w/$
PS2=
OSTYPE=Linux
操作原理
这个程序遍历environ变量以打印出整个环境。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。