每个程序都有一个环境表,它是一个字符指针数组,其中每个指针包含一个以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");elseprintf("%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 1int ret = unsetenv("ABD=");printf("ret = %d\n", ret);val = getenv(name);printf("3, %s = %s\n", name, val);#elseint ret = unsetenv("ABD");  //name=value:valueprintf("ret = %d\n", ret);val = getenv(name);printf("3, %s = %s\n", name, val);#endifreturn 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

环境变量表--extern char **environ;相关推荐

  1. Linux 环境编程 day01 Linux系统介绍、GNU编译工具、静态/共享库、环境变量表

    Linux 环境编程 day01 Linux系统介绍.GNU编译工具.静态/动态库.环境变量表 学习Linux环境编程的原因 UNIX系统介绍 Linux系统介绍 GNU工程 POSIX标准 GNU通 ...

  2. 《Linux进程概念,进程创建退出等待替换,环境变量等基础操作 ---总结》

    前言 Linux系统的进程概念,进程状态,以及操作创建进程,还有环境变量及相关指令,程序地址空间等一些知识的梳理,将自己的理解总结如下,希望和各位一起进步,一起学习. 以下是本篇文章正文内容. 文章目 ...

  3. Linux系统中环境变量的设置,getEnv,putEnv, environ全局变量的使用

    环境表简介: 环境表中存储了程序的运行环境的所有的环境变量,例如路径path,用户USER,Java环境变量JAVA_HOME...等等. 查看环境变量: 在window上中,可以通过"高级 ...

  4. 访问进程环境变量environ时的一个坑

    在unistd.h中定义了变量char **environ;来表示当前所有环境变量,一般来说访问特定环境变量可以用getenv,但是想遍历所有环境变量就得使用environ. 即在程序内全局声明ext ...

  5. Linux下environ环境变量操作函数

    #include <stdio.h>int main(int argc,char *argv[],char **envptr) {int i=0;for(i=0; envptr[i]!=N ...

  6. 环境变量environ

    void getenviron(void) {extern char ** environ;char **pe= environ;while(*pe != NULL){cout<<*pe& ...

  7. Linux 应用 environ环境变量操作函数

    功能:打印Lunux下面环境变量 #include <stdio.h>int main(void) {extern char **environ; // 声明就能用int i = 0;wh ...

  8. python os.environ.setdefault_django os.environ慎用setdefault操作环境变量

    在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...

  9. python os.environ.set_django os.environ慎用setdefault操作环境变量

    在绝大多数情况下,如果需要在程序运行过程中设置环境变量,使用os.environ.setdefault函数是没有任何问题的,但是有两种场景下setdefault会造成意外的问题,需要慎用: 如果程序执 ...

最新文章

  1. 计算机与网络技术基础试题及答案,计算机与网络技术基础试题及答案(2003年10月)...
  2. Python 列表(数组)初识
  3. 显示不出中文_优惠拿不出手,销量却吊打对手,宝马3系到底强在哪?
  4. html text 默认选中,html - 如何在Shiny中默认选择verbatimTextOutput中的文本? - SO中文参考 - www.soinside.com...
  5. oracle 字段除以1000,ORACLE常用}1000(之一)_oracle
  6. C++工作笔记-对友元函数的进一步理解
  7. 第九次作业(杨辉三角)
  8. 不用写代码,谷歌教你如何用2个小时做出只属于你的游戏。
  9. Filter_Listener:过滤器和监听器
  10. CMU 15-213 Introduction to Computer Systems学习笔记(9) Program Optimization
  11. 服务机器人分类包括哪些?
  12. python实数符号_下列格式化符号中,用来表示浮点实数的是()。 (6.0分)_学小易找答案...
  13. vue-cli脚手架build目录中的webpack.base.conf.js配置文件
  14. Linux 通信机制 I/O多路复用之select
  15. 开启迅盘:ReadyBoost和ReadyDrive的开启方法
  16. vue手写签名,canvas手写签名,canvas签名图片旋转
  17. nn.Squential与nn.ModuleList区别
  18. Vue使用快速使用Echarts图标以及使用水滴图
  19. x86架构手机_为什么苹果放弃的是x86,而不是ARM?
  20. umi创建简单的登录界面

热门文章

  1. APP测试主要测的是什么?
  2. JavaScript-初识ajax、ajax封装、及json对象使用(上)
  3. chrome浏览器出现Uncaught DOMException: Failed to execute ‘postMessage‘ on ‘Window‘: HTMLUnknownElement ob
  4. R语言对基因进行GO注释(附代码)
  5. POI导出Excel设置背景色踩坑,解决背景色全黑(无效)的问题及指定列添加背景色,自定义颜色
  6. grib2转json
  7. Java Web简单搜索功能实现
  8. 相比之下,在美国看病简直是噩梦
  9. RabbitMQ 启动报错:Error: unable to perform an operation on node ‘rabbit@***‘. Please see diagnostics...
  10. js+vue分片上传大文件`