如何为当前进程设置环境变量

如何为当前进程设置环境变量,第1张

获得一个环境变量可以通过调用‘getenv()’函数完成。#include <stdlibh> char getenv(const char name);设置一个环境变量可以通过调用‘putenv()’函数完成。#include <stdlibh> int putenv(char string);变量string应该遵守"name=value"的格式。已经传递给putenv函数的字符串不能够被释放或变成无效,因为一个指向它的指针将由‘putenv()’保存。这意味着它必须是在静态数据区中或是从堆(heap)分配的。如果这个环境变量被另一个‘putenv()’的调用重新定义或删除,上述字符串可以被释放。/译者增加因为putenv()有这样的局限,在使用中经常会导致一些错误,GNU libc 中还包括了两个BSD风格的函数:#include <stdlibh> int setenv(const char name, const char value, int replace); void unsetenv(const char name);setenv()/unsetenv()函数可以完成所有putenv()能做的事。setenv() 可以不受指针限制地向环境变量中添加新值,但传入参数不能为空(NULL)。当replace为0时,如果环境变量中已经有了name项,函数什么也不做(保留原项),否则原项被覆盖。 unsetenv()是用来把name项从环境变量中删除。注意:这两个函数只存在在BSD和GNU 库中,其他如SunOS系统中不包括它们,因此将会带来一些兼容问题。我们可以用 getenv()/putenv()来实现:int setenv(const char name, const char value, int replace) { char envstr; if (name == NULL || value == NULL) return 1; if (getenv(name) !=NULL) { envstr = (char ) malloc(strlen(name) + strlen(value) + 2); sprintf (envstr, "%s=%s", name, value); if (putenv(envstr)); return 1; } return 0; }译者增加/记住环境变量是被继承的;每一个进程有一个不同的环境变量表拷贝(译者注:从core文件中我们可以看出这一点)。结果是,你不能从一个其他进程改变当前进程的环境变量,比如shell进程。假设你想得到环境变量‘TERM’的值,你需要使用下面的程序:char envvar; envvar=getenv("TERM"); printf("The value for the environment variable TERM is "); if(envvar) { printf("%s\n",envvar); } else { printf("not set\n"); }现在假设你想创建一个新的环境变量,变量名为‘MYVAR’,值为‘MYVAL’。以下是你将怎样做:static char envbuf[256]; sprintf(envbuf,"MYVAR=%s","MYVAL"); if(putenv(envbuf)) { printf("Sorry, putenv() couldn't find the memory for %s\n",envbuf); / Might exit() or something here if you can't live without it / }怎样读取整个环境变量表?如果你不知道确切你想要的环境变量的名字,那么‘getenv()’函数不是很有用。在这种情况下,你必须更深入了解环境变量表的存储方式。全局变量,‘char envrion’,包含指向环境字符串指针数组的指针,每一个字符串的形式为‘“NAME=value”’(译者注:和putenv()中的“string”的格式相同)。这个数组以一个‘空’(NULL)指针标记结束。

运行在tomcat里的war包是无法直接读取 *** 作系统的环境变量的,它读取的是运行war包的服务器进程的环境变量,也就是tomcat的环境变量。

根据官方文档,区别于CATALINA_HOME和CATALINA_BASE,其它的环境变量可以用setenv脚本来实现。这个脚本一般放在CATALINA_BASE/bin 或者 CATALINA_HOME/bin文件夹下。tomcat会自动去执行这个脚本。

比如在centos7环境中,在$CATALINA_BASE/bin/setenvsh 文件中配置环境变量:

export JRE_HOME=/usr/java/latest

export  CATALINA_PID="$CATALINA_BASE/tomcatpid"

备注:这里的环境变量仅限于用标准脚本启动tomcat才能使用。我用的是centos,脚本里需要用export导出才有效。

#include <stdlibh>

#include <stdioh>

int main(void)

{

char pathvar;

pathvar = getenv("PATH");

printf("pathvar=%s",pathvar);

return 0;

}

环境变量可以帮助提升你的Shell体验。很多程序和脚本都通过环境变量来获取系统信息,存储临时数据和配置信息。

bash使用环境变量( environment variables)来存储有关shell会话和工作环境的信息。这项功能允许你在内存中存储数据,以便程序或shell脚本能够轻松访问。这是存储持久数据的一种简便方法。bash的环境变量分为两类:全局变量和局部变量。

补充:bash使用一致的专有环境变量,但是不同发行版的linux可能会添加自己的环境变量,本博客使用的发行版为Ubuntu 16045 Gnome。

全局变量对于shell会话和所有生成的子shell都是可见的。全局环境变量有助于子shell获取父shell信息。

在Linux中有四个命令可以帮助我们查看所有的环境变量,printenv、env、set、declare。

使用set命令时会一起显示之前定义的函数,仅显示变量可以使用如下命令:

局部变量只能在定义它们的进程中可见,Linux也有默认定义的标准局部环境变量。你也可以自己定义局部环境变量,称为用户定义局部变量。

set命令会显示某个特定进程的所有环境变量,包括局部变量、全局变量以及用户定义变量。

补充:set、env、printenv之间的区别很细微。set命令会显示出所有变量,并且按照字母顺序排序。env和printenv输出相同,但是仅含有全局变量,并且未对变量排序。

设置局部用户定义变量,就是之前002一节提到的变量。

注意:一般bash的环境变量都是使用的大写字母,建议自己的变量名为小写,避免产生冲突。

设置全局环境变量

先创建一个局部环境变量,然后使用export命令将其导出到全局变量。

使用unset命令,格式unset varname

注意:在子shell中删除全局环境变量不会影响到父shell的全局环境变量。

HOME:当前用户的主目录

IFS:shell用来将文本字符串分割成字段的一系列字符

PATH:shell用来查找命令的目录列表。当你输入一个命令时,shell会按照这个目录遍历寻找。

在登录系统启动一个bash shell时,默认情况下bash会在几个文件中查找命令。这些文件叫做启动文件或者环境文件。bash检查的启动文件取决于启动bash的方式:

登录Linux系统是,bash作为登录shell启动。登录shell会一次从以下几个启动文件中读取命令。

/etc/profile文件是系统上默认的bash shell的主启动文件。系统上的每个用户登录时都是执行这个文件。

注意: 某些Linux发行版使用了可拆卸式认证模块(PAM)。这时,PAM文件会在bash启动前处理,这些文件可能会包含环境变量。PAM文件包括/etc/environment和$HOME/pam_environment文件。

我们这里来查看一下/etc/profile文件的内容,学了之前的内容的话,这个文件很容易理解。

$HOME目录下的启动文件

剩下的启动文件都启着同一个作用:提供一个用户专属的启动文件来定义该用户所用到的环境变量。一般Linux发行版只有到下面这四个启动文件中的一两个。

这里列出Ubuntu的启动文件:

可以看到这里只有bashrc和profile两个文件。

shell会按照以下顺序执行启动文件,找到第一个其他的就会被忽略。

注意:这里没有$HOME/bbashrc,因为该文件是通过上面三个文件中的一个运行的。

我们来查看一下profile文件,bashrc文件请自行查看。

注意:这里会检查当前运行的shell是否是bash,如是的话,检查是否存在$HOME/bashrc,若存在则加载该文件。

交互式shell不是登录系统时启动的,它可能是你打开终端启动的。交互式shell不会访问/etc/profile文件,而是只会检查用户HOME目录中的bashrc文件。

执行shell脚本是的非交互式shell。脚本能以不同的方式执行,可以启动子shell执行,也可以在当前shell中执行。

bash提供了一个BASH_ENV的环境变量,当shell启动一个非交互式shell进程时,它会检查这个环境边浪来查看要执行的启动文件。若有指定的文件,则shell会执行该文件。Ubuntu未设置该变量。

若BASH_ENV未设置,那么非交互式shell如何获得环境变量呢?对于以子shell进程执行的情况,子shell会继承父shell导出的变量(export)。对于在当前shell中执行的情况,变量即为当前shell的变量。

linux环境

使用inittab启动并监控应用程序时,getenv("LOGNAME") 为空

示例:inittab->startsh->启动程序,getenv("LOGNAME") 获得环境变量 LOGNAME 为空;但如果是远程登陆偶,手动执行:startsh->启动程序时,可以获得到正确的环境变量值,比如 root

处理办法:新建shell->runs,执行之前的startsh,示例:su - root -s /bin/bash /usr/local/ipcc/startsh

以上就是关于如何为当前进程设置环境变量全部的内容,包括:如何为当前进程设置环境变量、tomcat的系统环境变量、C++如何获取系统环境变量等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/9528794.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存