linux环境变量设置的三种方式

在c中设置

1、getenv()
函数名: getenv
功 能: 从环境中取字符串,获取环境变量的值
头文件: stdlib.h
用 法:char *getenv(char *envvar);
函数说明:getenv()用来取得参数envvar环境变量的内容。参数envvar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为envvar=value。getenv函数的返回值存储在一个全局二维数组里,当你再次使用getenv函数时不用担心会覆盖上次的调用结果。
返回值: 执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。如果变量存在但无关联值,它将运行成功并返回一个空字符串,即该字符的第一个字节是null。
相关函数:_wgetenv、getenv_s、_wgetenv_s
2、putenv
首先要说明的是,通过此函数并不能添加或修改 shell 进程的环境变量,或者说通过setenv函数设置的环境变量只在本进程,而且是本次执行中有效。如果在某一次运行程序时执行了setenv函数,进程终止后再次运行该程序,上次的设置是无效的,上次设置的环境变量是不能读到的
putenv(改变或增加环境变量)
  相关函数 getenv,setenv,unsetenv
  表头文件 #include<stdlib.h>
  定义函数 int putenv(const char * string);
  函数说明:putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。
  返回值:执行成功则返回0,有错误发生则返回-1。
  错误代码:ENOMEM 内存不足,无法配置新的环境变量空间。

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv, char **env) {
    extern char **environ;
    printf("env = %p, environ = %p\n", env, environ);
    /* env和environ的地址相同, */
    /* 说明main的第三个参数就是环境表的首地址; */
    char *value = getenv("LANG");
    printf("value = %s\n", value);
    putenv("VAR=ABC");    //新增环境变量;
    printf("%s\n", getenv("VAR"));    //ABC
    putenv("VAR=123");    //新增环境变量;
    printf("%s\n", getenv("VAR"));    //123
    setenv("VAR", "456", 0);    //0代表不覆盖;
    printf("%s\n", getenv("VAR"));    //123,不变
    setenv("VAR", "789", 1);    //非0代表覆盖
    printf("%s\n", getenv("VAR")); //789
    return 0;
}

将上述代码编译成a.out ,执行。putenv ,setenv ,都是只在这个elf里有效。
例如:我执行a.out,然后我在命令行 echo $var, 或者printenv | grep var是得不到环境的. 即使我c中return 0前面加while(1){} ,卡住程序,也一样得不到

shell中设置

export
功能: 设置或显示环境变量

语法: export [-fnp] [变量名称]=[变量值]

说明: 在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅及于该此登陆操作。

参数:
-f 此时变量名称为函数名称。
-n 删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
-p 列出所有的环境变量。

举例:

export PRJROOT=/home/eriol/newproject
export PREFIX=${PRJROOT}/tools
export PATH=${PATH}:${PREFIX}/bin

Linux系统环境变量中,路径名用冒号分隔。

注意:export设置只对当前的bash登录session有效,它是存在内存里面的。

对于这个的解释,我们可以在做实验,例如我在c中调用system(export TEST=$TEST:/HELLO); 执行a.out后, 命令行执行printenv | grep TEST ,是没有结果的。 因为system相当于,fork然后执行了一个shell,调用完system,也就执行完了shell,export也就没了

环境变量永久生效

1 /etc/profile

2 .bash_profile

其中,/etc/profile是全局的环境变量,对所有用户生效,而.bash_profile只对当前用户启作用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_kerneler

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值