环境变量 linux,linux下,关于环境变量

  环境变量 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变量以打印出整个环境。

环境变量 linux,linux下,关于环境变量