什么是环境变量?
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
常见的环境变量
PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。
如何查看环境变量?
env—查看全部环境变量
在Linux和Unix-like系统中,env是一个命令行实用程序,用于显示当前环境中所有的环境变量及其值。它不接受任何参数,而是直接输出当前环境中所有的环境变量。
echo +环境变量名
例如:如果我们想查看$PATH,则可以用echo $PATH 来用于查看指定命令的搜索路径。
[amazon@iZ7xvfrafhk3mf5qwrf2gxZ ~]$ echo $PATH /usr/local/apache/bin:/usr/local/php/bin:/usr/local/mysql/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/amazon/.local/bin:/home/amazon/bin
在以上打印出来的环境变量$PATH中,以冒号作为分隔符,每一个冒号,后面都对应着一个路径。如:
- /usr/local/apache/bin:这是一个指向Apache服务器二进制文件的目录路径。Apache是一个流行的Web服务器软件,安装在大多数Linux和Unix-like系统上。
- /usr/local/php/bin:这是一个指向PHP编程语言二进制文件的目录路径。PHP是一种流行的开源脚本语言,常用于开发动态网页和应用程序。
3./usr/local/mysql/bin:这是一个指向MySQL数据库管理系统二进制文件的目录路径。MySQL是一种流行的开源关系型数据库管理系统,常用于存储和处理数据。
4./usr/local/bin、/usr/bin、/usr/local/sbin、/usr/sbin:这些都是标准的系统目录路径,包含了许多常用的工具和命令行程序。
5./home/amazon/.local/bin、/home/amazon/bin:这些都是个人用户的目录路径,通常包含了一些自定义的工具和命令行程序。
在使用$PATH变量值时,系统会按照从左到右的顺序遍历目录中的二进制文件,并尝试运行第一个找到的匹配文件。因此,为了确保某个特定的命令可以正确地工作,你需要将其安装在$PATH变量中的某个目录中,并确保该目录出现在$PATH变量的前部。例如,如果你想在命令行中使用php,你可以在上述$PATH变量值中添加/usr/local/php/bin目录,并确保其出现在其他目录之前。
同理,如果要查看其他的环境变量也可用echo命令打印:
$PATH拓展
通过修改$PATH,使得程序不需要找到对应的路径即可运行,即: ./exe -> exe
export PATH=$PATH: 当前路径
通过以上代码将新的路径添加到$PATH环境变量中,使得系统可以自动找到对应的路径,而不需要自己再找路径,这也可以理解成“程序的安装”。
PATH=$PATH:是Linux和Unix系统中常用的命令行语法,它可以用来添加新的路径到当前用户的PATH环境变量中。如果你直接使用PATH=路径将修改全部路径,会覆盖原有的$PATH路径。
如果你想将新的路径添加到PATH中,可以在PATH变量的末尾添加一个冒号(:),然后再添加新的路径。例如:
export PATH=$PATH:/path/to/new/directory
在这个例子中,我们将新的路径/path/to/new/directory添加到了当前用户的PATH环境变量中。这意味着系统现在会在新的路径中查找可执行文件。
注意,如果你已经设置了PATH环境变量,你需要在~/.bash_profile文件中添加上述命令或者运行 source ~/.bashrc 来使改变生效(实际上是修改了bash的脚本配置文件)。如果没有执行其中的语句,实际上只是临时的路径,在你的Linux重启后PATH环境变量会恢复原样(这是因为命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量,是父进程bash给我们传递的)。如下:
如何获取环境变量?
getenv()获取指定环境变量的值
getenv()是C语言库函数,用于获取指定环境变量的值。它的原型如下:
char *getenv(const char *name);
参数name是要获取的环境变量名,函数返回值是一个字符串,表示环境变量的值。如果环境变量不存在,则返回NULL。
在C++中,可以通过std::getenv()函数来调用getenv()函数。其原型如下:
const char* getenv(const char* name);
参数name是要获取的环境变量名,函数返回值是一个字符串,表示环境变量的值。如果环境变量不存在,则返回NULL。
例如:如下为获取$USER的环境变量。
#include<stdlib.h> #include<stdio.h> #include<unistd.h> int main() { char* ev=getenv("USER"); if(ev) { printf("%s\n",ev); } return 0; }
通过命令行参数获取环境变量
我们知道main()实际上包涵三个参数,即:main(int argc,char*argv[],char * envp[]),其中,argc是一个整数,表示命令行参数的数量(不包括程序名称)。argv[]是一个指向字符数组的指针,数组中的每个元素都是一个命令行参数的地址。envp[]是一个指向字符数组的指针,数组中的每个元素都是一个环境变量的地址。
如下:打印全部环境变量
#include<stdlib.h> #include<stdio.h> #include<unistd.h> int main(int argc,char*argv[],char * envp[]) { int i=0; for(;envp[i];i++) { printf("pid:%d,envp[%d]: %s\n",getpid(),i,envp[i]); } char* ev=getenv("USER"); return 0; }
通过第三方变量environ来获取环境变量
environ是一个全局变量,它是以环境变量的方式存储在栈上的字典。当你通过putenv()或setenv()函数添加环境变量时,它们实际上是在修改environ。
environ是一个指向struct passwd类型的指针,其中struct passwd是一个结构体,用于描述用户账户信息。在struct passwd中,environ字段指向一个包含环境变量的链表。每个链表节点都是一个包含环境变量名和值的字符串。
由于environ是一个全局变量,因此你可以直接访问它来获取或设置环境变量。例如:
#include <stdio.h> #include<unistd.h> int main(int argc, char *argv[],char *envp[]) { extern char **environ; int i = 0; for(; environ[i]; i++) { printf("pid:%d ,environ[%d]: %s\n",getpid(),i,environ[i]); } return 0; }
如何设置环境变量?
在Linux中,export命令用于设置或显示环境变量。在shell中执行程序时,shell会提供一组环境变量。使用export命令可以新增,修改或删除环境变量,供后续执行的程序使用。
export命令的一般语法格式为:
export [-fnp][变量名称]=[变量设置值]
具体参数含义如下:
- -f 代表 [变量名称]中为函数名称。
- -n 删除指定的变量。需要注意的是,这里的删除并不真正移除这个变量,而是使其不会输出到后续指令的执行环境中。
- -p 列出所有的shell赋予程序的环境变量。
如下:
当然这只是临时修改的环境变量,当重启Linux系统后就不存在了,要想使其重启后仍然失效,你需要在~/.bash_profile文件中添加上述命令或者运行
source ~/.bashrc
来使改变生效。
如下命令打开脚本配置文件,并且修改:
vim ~/.bash_profile
set和unset
在 Linux 系统中,set 和 unset 是两个常用的命令,分别用于设置环境变量和删除环境变量。set 命令用于显示或设置 shell 的配置选项、命令别名、环境变量等。当它没有参数时,会显示当前 shell 的所有配置选项、命令别名和环境变量的信息。当它有参数时,可以设置相应的配置选项、命令别名或环境变量。
例如,要查看当前 shell 的所有环境变量,可以输入以下命令:
set
要设置一个名为 MY_VAR
的环境变量,并将其值设置为 Hello, World!
,可以输入以下命令:
set MY_VAR=Hello, World!
unset
命令用于删除环境变量。当它没有参数时,会列出所有可用的环境变量。当它有参数时,会删除指定的环境变量。
例如,要查看当前 shell 中的所有环境变量,可以输入以下命令:
env
要删除名为 MY_VAR
的环境变量,可以输入以下命令:
unset MY_VAR
注意,删除环境变量可能会影响到正在运行的程序。因此,在使用
unset
命令时,应该谨慎考虑其影响范围。
感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!