environ和getenv函数
在Linux中,environ是一个全局的外部变量,其类型为char**,存储着系统的环境变量。除了使用主函数中的第三个参数外,我们也可使用environ函数直接访问系统的环境变量。
注意:这里在代码内部使用environ时,需要先定义environ。在系统下的libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。定义如下:
extern char **environ;
getenv是通过指定的环境变量名称来获取环境变量,在头文件<stdlib.h>中。
环境变量表
环境变量表简称环境表,它是一个存储环境变量的数据结构,类似于一个数组,其中每个元素都是一个环境变量,而environ指针指向的就是存放环境变量的数据结构,而getenv指向表中指定名称的环境变量。
下面代码通过使用environ来获取系统下的所有环境变量。
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
extern char **environ;
for (int i = 0; environ[i]; i++)
{
cout << "environ[" << i << "]: " << environ[i] << endl;
}
return 0;
}
下面使用getenv获取表中的指定名称的环境变量
[zhujunhao@bogon code]$ cat code.cpp
#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
char*s = getenv("PATH"); //访问PATH环境变量
cout << s << endl;
return 0;
}
[zhujunhao@bogon code]$ g++ -o code.exe code.cpp[zhujunhao@bogon code]$ ./code.exe
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/zhujunhao/.local/bin:/home/zhujunhao/bin
[zhujunhao@bogon code]$ echo $PATH //可看出,代码输出的内容与之相同
/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/home/zhujunhao/.local/bin:/home/zhujunhao/bin
环境变量的存放
Linux系统下的环境变量天然都会被保存在磁盘的文件中。只有登入系统时,bash/shell进程才会存在,也就是说只有登入系统的时候,才会分配bash/shell程序,而环境变量就在bash/shell的上下文中。当开始登入系统时,所有的环境变量都是从磁盘中的某些脚本或配置文件中来的。因此,每当重启系统时,环境变量都会被更新。
通常,我们可以使用 set 指令显示本地定义的shell变量和环境变量,但要注意的是,本地定义的shell变量不能被子进程进行下去,它只在本地bash内部有效。
下面我们来认识一下 bash_profile 文件。
在Linux系统中,.bash_profile
是一个Shell脚本文件,它被用于在用户登录时设置用户的环境变量和配置选项。它是bash或shell的配置文件之一,通常位于用户的家目(~/.bash_profile
)
当用户登录时,bash_profile
文件会被自动执行,允许用户设置环境变量等。通过编辑bash_profile
文件,用户可以定制自己的shell会话环境,以便更方便地使用命令行工具和应用程序。下面是代码演示:
首先,我们要进行配置环境变量
[zhujunhao@bogon ~]$ cat .bash_profile
//下面是系统下的源代码
# .bash_profile# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi# User specific environment and startup programs
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
//下面是我们设置的一个简单的环境变量MY
MY=yiyezhiqiu
export MY
因为当系统启动时,环境变量就已执行,因此,配置完毕之后要重启系统才可被运行[zhujunhao@bogon ~]$ echo $MY
yiyezhiqiu