"Oh heiya New World!"
一、什么是环境变量?
谈起环境变量,也许我们在敲代码的层面上并不关心。在链接的时候,我们从来没有告诉编译器,去哪里找动态库去链接;我们也从来没有告诉进程 执行该进程的用户是谁?以及在命令行解释器时,启动一个进程,实质是在命令行解释器内 进行程序替换……
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性
二、常见的环境变量
(1)理解PATH
我们在使用命令行解释器时,通常直接使用ls 、 pwd 、top 等等”命令"时 为什么不需要带"./"? 但是我们自己写的程序却需要这样呢?
根本上不是说我们的程序 貌似更"低级",因为ls pwd top等命令也是可执行的文件,它们无非是在 用户登录时 已经就加载好了!并且能够找到该路径下的 可执行文件!
//指定命令的搜索路径
echo $PATH
但那些配置的文件在哪里呢?
1.“/etc/profile”文件,该文件配置的环境变量将应用于登录到系统的每一个用户;
2.“/etc/bashrc”,修改该文件配置的环境变量将会影响所有用户使用的bash shell;
3.“/etc/environment”,该文件包含与系统运行相关但与用户无关的环境变量;
4.“~/.profile”;5、“~/.bashrc”。
如何让自己的可执行程序 也成为系统命令那样跑?
①将自己的可执行文件 拷贝到 被填入进PATH里的路径下(不推荐);
②export导入该程序的路径(推荐);
(2)其余环境变量
①HOME
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
②SHELL
SHELL : 当前Shell,它的值通常是/bin/bash。
③查看环境变量
//查看
echo $环境变量名
(3)定义环境变量
export: 设置一个新的环境变量
env: 显示所有环境变量
unset: 清除环境变量
set: 显示本地定义的shell变量和环境变量
我们在命令行定义的变量,是本地变量;
因此需要导入变量;
进行取消设置;
三、进程内的环境变量
上述仅仅从命令行解释器这个层面上,解释了环境变量。但是 环境变量是贯穿整个程序始终的全局变量。
比如: 在一个受权限限制的文件,它是如何辨别谁可以对他进行什么合法操作 什么不合法?
为什么不同的用户进行vim配置 会有对应不同的vim编辑器?
(1)main函数的三参数
int main(int argc,char *argv[],char *envp[])
1. 为什么main函数会有三个参数?这三个参数是什么意思?
2. main作为一个函数 是否应该被调用? 被谁调用呢?
3. main函数的返回值是返回给谁的呢?
C语言规定main函数是C程序的入口,程序中的其它函数直接或间接被main函数调用后才能被执行,如果没有被main调用,这个函数在程序中就是无用的。
在linux下 main函数的传参 是传给”子进程”的!
argc:表示运行程序的时给main函数传递参数的数量;
argv:字符串的数组,向一个字符串,末尾为NULL结尾;
envp:也是一个字符串的数组,以NULL结尾;
多说无益,上来实操。
所以,有时候我们就可以根据 传参的选项 执行不同 的代码逻辑;
(2)环境变量
①getenv
#include <stdlib.h>
char *getenv(const char *name);
②main参数 与 全局指针environ
命令行bash 为main创建子进程,子进程会继承父进程的环境变量。 这也是为什么 我们可以查看和 bash页面下 一样的环境变量。
一般推荐使用getenv 直接拿到想要的环境变量。
③进程内添加环境变量;
#include <stdlib.h>
int putenv(char *string);
总结
①echo $+环境变量名 可以查看变量
②main的三个参数
③getenv \envp[] \ char** envrion 都可以获取环境变量