2013-03-04 19:37:55 cozzw 阅读数 128

声明:unix板块下代码参考《21天学通c++》、精通UNIX下c语言编程与项目实践

获取所有环境变量内容

  #include <iostream>
  using namespace std;


  int main(int argc, char* argv[], char* env[])
  {
for(int i=0; env[i]!=NULL; ++i)//编程习惯:对于指针数组,如果不说明元素个数,总是将一个NULL放
在数组末尾
{
cout<<env[i]<<endl;
if(i%8 == 0)
  cin.get();
}
  }


  获取任意环境变量值
  #include <iostream>
  using namespace std;


  int main()
  {
char* name = "HOME";
char* value = NULL;
value = getenv(name);
cout<<value<<endl;
  }


  设置任意环境变量值
  #include <iostream>
  using namespace std;


  int main()
  {
char* env = "sd=zaozhuang";
char* name = "sd";
char* value = NULL;


putenv(env);

value = getenv(name);
cout<<value<<endl;
  }


  
2013-06-09 14:21:47 zpxly 阅读数 812

Linux下处理环境变量常见的几个操作:

env:显示当前所有的环境变量

set:显示当前bash下用户自定义的变量和环境变量

export:把自定义的变量转换成环境变量


环境表:

Unix下的每一个程序都会有一张环境表,其实我们可以想象,main函数使如下这种形式:

int main(int argc , char*argv[], char *envp[])

 ISO C 规定了main函数没有第三个参数,所以Unix系统提供了全局变量environ,

环境表如下:


 

下面我们打印当前环境变量验证一下:

#include <stdio.h>
#incldue <stdlib.h>
extern char **environ
int main()
{
	char **var;
for(var=environ;*var!=NULL; var++)
	printf(“%s\n”,*var);
exit(0);
}

会发现和我们在终端输入env的结果是一样的。


通常情况下,我们只对某些环境变量感兴趣,所以系统提供了以下几个函数:

#include <stdlib.h>
Char *getenv(const char*name)
 
Int putenv(char *str)
Int setenv(const char *name, const char *value, int rewrite)
Int unsetenv(const char *name)

(记不住就man,I like the man @_@




2019-04-06 17:20:17 u014630623 阅读数 273

博客搬家,原地址:https://langzi989.github.io/2017/05/22/Unix环境变量/

概述

在Unix中,每个进程都有自己的一组环境变量,这些环境变量,要么是一组全局字符串,要么是子进程从父进程继承而来的,如果子进程不对其修改则与父进程的环境变量一模一样。
Unix内核并不查看这些字符串,它们的解释权完全取决于各个应用程序。例如shell是Unix中一个可执行程序,通常shell的启动文件中会对环境变量进行设置。所以当我们进入shell之后可以查看path等环境变量。在当前shell中启动的进程会继承其父进程shell的环境变量,也就可以查看path等环境变量,环境变量可以在登录的时候自动设置,也可以由用户自行设置。

环境变量相关变量

每个程序都会接收到一张环境表。与参数表一样,环境表也是一个字符指针数组。其中每个指针都包含一个以NULL结尾的字符串的地址。全局变量
environ指向了这个数组的地址。

代码如下:

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

extern char **environ;
if (environ!= NULL) {
        for (i = 0; environ[i] != NULL; i++) {
            printf("env: %s\n", environ[i]);
        }
}

环境变量相关的函数

与环境变量相关的函数包括以下几种:取环境变量的值,添加环境变量、修改环境变量、以及删除环境变量.

  #include <stdlib.h>

  //获取环境变量的值
  char* getenv(const char* name); //若包含此key返回对应的值,否则返回NULL

  /*
  * function: 修改环境变量的值 前面两个分别为键值对,最后一个表示是否需要删除原有的定义重写。
  * params:键没有存在,则创建此键值对。若键已经存在:rewrite=0时不覆盖原来的值;rewrite!=0覆盖原来的值
  * return:成功返回0, 出错返回非0。
  */
  int setenv(const char* name, const char* value, int rewrite);

  /*
  * function: 添加环境变量,若存在则删除原有的,添加新的,不存在则直接添加
  * params:  参数为一个键值对字符串,如"name=test"
  * return: 成功返回0,不成功返回-1
  */
  int putenv(char *str);

  /*
  * function: 删除name的定义,即使不存在也不出错。
  * params: 参数为键
  * return:出错返回-1,不出错返回0
  */
  int unsetenv(const char*name);

  /*
  * function: 清除所有的环境变量
  * return: 成功返回0, 失败返回-1。
  */
  int clearenv();

putenv和setenv的区别

putenv可以使用程序中已经定义的且形如"name=value"的字符串作为参数。此时系统不再为该环境变量分配内存,环境变量将使用程序中定义变量的内存。
并将该字符串的地址保存在环境变量中。所以要使用putenv一定要用全局变量作为参数,否则程序退出栈内存被释放,再次访问环境变量将会出现未定义行为,
导致环境变量不可用。

putenv也可用字符串常量做参数,这个时候系统将为其分配内存。

但是setenv去设置环境变量系统将会先malloc出一块内存给环境变量使用,所以此时不需要担心环境不可用的情况。

环境变量在进程空间中的存储位置

环境变量和环境字符串通常放在进程存储空间的顶部,也就是栈内存之上

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

extern char **environ;
int main() {
    int i;
    printf("the address of the environment: %p\n", environ);
    printf("the adress of first i: %p\n", &i);
}

环境变量中进行增删改操作的实现机制

删除环境变量比较容易,当增加或者修改环境变量的时候由于环境表和环境字符串通常占用的是进程地址空间的顶部,所以它不能再向
高地址(向上)扩展,同时也不能在移动在它之下的各栈帧,所以也不能向下扩展。两者的组合使得该空间的长度不能再增加。

  • 删除环境变量:删除环境变量时只需要先找到该指针,然后将所有后续指针都向环境表的首部顺序移一个位置。
  • 修改环境变量:
    • 若新的环境变量value长度小于或者等于原有的值,则直接将其复制到旧值。
    • 否则,先调用malloc在堆上分配一块内存,然后将新字符串指向该空间,接着使环境变量表中针对name的指针指向新分区。
  • 增加环境变量: 增加新环境变量比较复杂。必须首先通过调用malloc为新的name=value分配内存空间,然后将字符串复制到此空间中。
    • 如果该name是第一次增加,则必须调用malloc为新的指针表分配内存空间,然后将原来的环境表复制到新的内存,并将指向新的name=value字符串
      的指针存放在该指针表的表尾,然后将空指针放在其后面。最后使environ指向新的环境表。这样就导致原来位于栈顶之上的环境表移到了堆内存中。
      但是大多数的环境指针仍然指向栈顶之上的name=value字符串。
    • 如果不是第一次新增加一个name,可知之前已经将环境表迁移到堆内存中,所以只需要调用realloc,以分配比原空间多存放一个指针的空间。然后将指针指向name=value
      字符串的指针,最后是一个NULL指针。
2011-11-15 15:56:28 housen1987 阅读数 72
  • 显示环境变量HOME

[linux@oss ~]$ echo $HOME

 

/zsmart/etl72_dev

 

  • 设置一个新的环境变量

[linux@oss ~]$ export HELLO="Hello"

 

[linux@oss ~]$ echo $HELLO

 

Hello 

  • 使用readonly命令设置环境变量为只读

使用readonly设置了环境变量为只读之后,该环境变量将不可修改或删除

  

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

[linux@oss ~]$ env

 

HOSTNAME=oss
SHELL=/bin/bash
TERM=ansi
HISTSIZE=1000
HELLO=HELL
QTDIR=/usr/lib/qt-3.3
OLDPWD=/zsmart
QTINC=/usr/lib/qt-3.3/include
USER=etl72_dev

...

 

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

 

[linux@oss ~]$ set

BASH=/bin/bash
BASH_ARGC=()
BASH_ARGV=()
BASH_LINENO=()
BASH_SOURCE=()

...

 

  • 使用unset命令清除环境变量,与set命令相对

如果未指定值,则该变量值设置成NULL

 

 

删除上面设置的环境变量HELLO

 

[etl72_dev@oss ~]$ unset HELLO

 

然后查看该变量

 

[etl72_dev@oss ~]$ echo $HELLO

 

会发现HELLO已经不存在了

 

  • 常用环境变量

PATH 决定shell将到哪些目录中寻找命令或程序

HOME 当前用户主目录

HISTSIZE 历史记录数

LOGNAME 当前用户登录名

HOSTNAME 主机名称

SHELL 当前用户Shell类型

LANGUAGE 语言相关环境变量

MAIL 当前用户邮件存放目录

PS1 基本提示符 root用户是#,普通用户是$

  • 环境变量类型

按变量生存周期来划分,可分为永久变量和临时变量。

 

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

 

临时变量:使用export命令声明,变量在关闭shell时失效

 

  • 设置环境变量的3种方法

1 在/etc/profile文件中添加变量,可对所有用户生效(永久的)

 

 export CLASSPATH=./JAVA_HOME/lib

 

 

如果需要在修改文件后马上生效,则需要运行命令

 

source /etc/profile

 

 2 在用户目录下的.bash_profile文件中增加变量(对本用户生效,对其他用户无效)

 

马上生效命令:

 

export /home/用户目录/.bash_profile

 

3 直接运行export命令

2014-12-28 20:12:02 qq302501035 阅读数 3029

Linux/Unix配置环境变量

Linux/Unix系统环境变量配置文件: 
/etc/profile:在登录时,操作系统定制用户环境时使用的第一个文件 ,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。 

/etc/environment:在登录时操作系统使用的第二个文件, 系统在读取你自己的profile前,设置环境文件的环境变量。 

~/.profile:在登录时用到的第三个文件 是.profile文件,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。 

/etc/bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.AIX中没有该文件,会有/etc/cshrc


~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。
(~  为当前用户home目录)


看看这几个文件都是干什么的: 
1./etc/environment–>是系统在登录时读取的第一个文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命 令,而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需加入一行形如 PATH=$PATH:/xxx/bin的代码即可。 
2./etc/profile–>是系统登录时执行的第二个文件,可以用于设定针对全系统所有用户的环境变量。 
3.~/.profile–>是对应当前登录用户的profile文件,用于定制当前用户的个人工作环境。 
4./etc/bash.bashrc–>是针对所有用户的bash初始化文件,在此中设定的环境变量将应用于所有用户的shell中,此文件会在用户每次打开shell时执行一次。 
5.~/.bashrc–>是对应当前登录用户的bash初始化文件,当用户每次打开shell时,系统都会执行此文件一次。

这几个文件的执行先后顺序应当是: 
/etc/enviroment –>/etc/profile –>~/.profile –>/etc/bash.bashrc–> ~/.bash

PASH环境变量的设置方法: 

方法一:用户主目录下的.profile或.bashrc文件(推荐) 

登录到你的用户(非root),在终端输入: 

$ sudo gedit ~/.profile(or .bashrc) 
可以在此文件末尾加入PATH的设置如下: 
export PATH="$PATH:your path1:your path2 ..."
保存文件,注销再登录,变量生效。

该方式添加的变量只对当前用户有效。 

方法二:系统目录下的profile文件(谨慎) 

在系统的etc目录下,有一个profile文件,编辑该文件: 

$ sudo gedit /etc/profile 
在最后加入PATH的设置如下: 

export PATH="$PATH:your path1:your path2 ..."
该文件编辑保存后,重启系统,或输入以下命令刷新环境变量,变量生效。
#source /etc/profile
该方式添加的变量对所有的用户都有效。 

方法三:系统目录下的 environment 文件(谨慎) 

在系统的etc目录下,有一个environment文件,编辑该文件: 
$ sudo gedit /etc/environment 
找到以下的 PATH 变量: 
PATH="<......>" 
修改该 PATH 变量,在其中加入自己的path即可,例如: 
PATH="<......>:your path1:your path2 …" 
各个path之间用冒号分割。该文件也是重启生效,或输入以下命令刷新环境变量,影响所有用户。

#source /etc/environment
注意这里不是添加export PATH=… 。 

方法四:直接在终端下输入 

$ sudo export PATH="$PATH:your path1:your path2 …" 
这种方式变量立即生效,但用户注销或系统重启后设置变成无效,适合临时变量的设置。 

注 意:方法二和三的修改需要谨慎,尤其是通过root用户修改,如果修改错误,将可能导致一些严重的系统错误,如果修改不当,可能导致其他系统命令也无法识别(系统找不到路径),因此笔者推荐使用第一种方法(只要不是root用户,修改不当还可以使用root再改回来,重新登录即可)。另外嵌入式 Linux的开发最好不要在root下进行(除非你对Linux已经非常熟悉了!),以免因为操作不当导致系统严重错误。root为Unix/Linux系统的最高权限用户,不像windows的Administrator,Administrator其实不是最高权限(这里不细究),root可以让你在系统上修改任何东西,伴随而来的也十分危险。



Unix的环境变量

阅读数 181

unix下环境变量

阅读数 6287

没有更多推荐了,返回首页