1.概念介绍
概念
环境变量是操作系统里面用来指定操作系统运行环境里的一些参数
如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪 ⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。
环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性
引入,argc argv
main函数有参数吗?有的
cpp
int main(int argc ,char*argv[])
argc有效元素的个数
argv记录命令行的指针数组,把命令行打散然后放到指针数组内


实际上命令行参数就是可以通过选项来实现不同的功能
如ls -a/-b/-c.....
bash会自动把命令行自动切分然后放进argv里面
实现代码
cpp
if (argc != 2)
{
printf("usage: %s [-a|-b|-c]\n", argv[0]);
return 1;
}
const char *arg = argv[1];
if(strcmp(arg, "-a")==0)
printf("这是功能1\n");
else if(strcmp(arg, "-b")==0)
printf("这是功能2\n");
else if(strcmp(arg, "-c")==0)
printf("这是功能3\n");
else
printf("usage: %s [-a|-b|-c]\n", argv[0]);
实现结果
2.通过例子来加以理解
2.1要执行一个程序,就必须先找到它
bash通过PATH来找环境变量
2.2系统中存在环境变量来帮助找到目标二进制文件。
一些基本知识
系统存在环境变量:PATH.->指定命令的搜索路径
查看所有环境变量指令:env
环境变量格式:名字=内容
具体操作:
echo $PATH(名字):用来获取对应环境名字的内容。
PATH:查找可执行程序的路径。
PATH = (某一路径),等于把该路径覆盖PATH路径。
如果覆盖了,关掉重新登陆,自动刷新。
正确方法:
PATH = $PATH:目标路径
如何理解环境变量?存储角度。

1.如何理解环境变量
举个例子,比如说"ls -a -b",登录,bash先根据系统配置文件生成环境变量表,后用户输入命令行参数,生成命令行变量表, 后拿ls在PATH里面找是否存在,存在,执行,不存在就找不到
然后根据"ls"命令在PATH查找对应的命令是否存在,存在的话就执行,不存在的话就报错
2.环境变量,最开始从哪来?
环境变量是系统中的配置文件来的。就是根据bashrc 和bash_profile。
登录是,bash自动创建,经过bashrc 和bash_profile。
bash读取配置文件,形成环境变量表,把一个一个环境变量填入表中,任何一个bash中右环境变量表和命令行参数表,两个都是字符串

3.认识更多的环境变量

HOME,表示当前用户的家目录
SHELL:/bin/bash
USER:当前登录的用户是谁
su - :重新登陆,更改user lognanme
lohname:表示登录的是谁。
HISTSIZE = 1000:记录最新的1000条指令
命令:history |,查看最新的1000条命令
HISTNAME:主机名
LS_COLOR:配色方案
PWD:当前工作路径
OLDPWD:上一条路径。
4.获取环境变量的方法
4.1操作
env :查看全部环境变量
echo $名字:查看对应环境变量名字的内容
export MYENV = 112223344:新增一组环境变量名字 = 内容关系
unset MYENV:取消环境变量
main参数最多有几个?三个
cppint main(int argc,char*argv[ ] ,char*env[ ] )env环境变量。
4.2代码
方法1:父进程bash,环境变量可以被子进程(孙子进程,等等)继承
->环境变量在系统中具有全局特性

方法2:getenv setenv(设置环境变量)
getenv:获取环境变量的内容。
以下是一个进行身份识别,只有我自己才可以运行,root也不行
方法3:environ(本身是一个指向环境变量表的指针,char** eniron,所以是双指针)

cpp
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
extern char **environ;
/// main有参数吗?有
/// 最多可以有几个? 3个
/// 是父进程传递给我们的
int main(int argc, char *argv[])
{
(void)argc;
(void)argv;
if(fork() == 0)
{
for(int i = 0; environ[i]; i++)
{
printf("environ[%d]-> %s\n", i, environ[i]);
}
}
sleep(3);
}
5.理解环境变量的特性
5.1全局性
5.2补充两个概念
bash会记录本地变量和环境变量
a.本地变量


不会被子进程继承,指挥在bash内部被使用
i=10
echo $i
得出10
b.我们的环境变量是在哪呢?

在bash里面。
属于export 内建命令( built-In command)不需要创建子进程,而是让bash自己亲自执行
bash自己调用,或者系统调用完成。




