目录
1. 环境变量的概念
2. 命令行参数
2.1
2.2 创建 code.c 文件
2.3 对比 ./code 执行和直接 code 执行
2.4 怎么可以不带 ./
2.4.1 把我们的二进制文件拷贝到 usr/bin 路径下,也不用带 ./ 了
2.4.2 把我们自己的路径添加到环境变量里
3. 认识PATH
3.1 PATH 指定命令的搜索路径
env
环境变量是一个变量
怎么可以看一个环境变量的内容?
4. 多方面了解环境变量
4.1 从存储的角度理解环境变量
4.1.2 环境变量的值是bash保存起来的
4.2 环境变量的组织方式:
4.3 环境变量,最开始从哪里来的?
4.4 如果Linux系统中有10个用户登陆?
5. 认识更多环境变量
HOME
SHELL :
HISTSIZE
HOSTNAME
PWD
6. 获取环境变量的方法
6.1 操作:
6.2 代码获取环境变量
6.2.1 方法1:main 函数获取环境变量
6.2.2 方法2: getenv 可以获得指定环境变量的内容
6.2.3 方法3:通过第三方变量 environ 获取
7.理解环境变量的特性
7.1 环境变量具有全局特性
7.1.1 环境变量可以被子进程继承
7.1.2 环境变量可以被子进程继承 ,为什么?
7.1.2.1 我们这里写一个程序只允许我们自己执行
7.2 补充:
7.2.1 : 本地变量
7.2.1.1 本地变量在bash内部具有一定的功能性
7.2.1.2 eg:续行
7.2.2 可以export导出为环境变量,env就可以显示了
7.2.2.1 内建命令
1. 环境变量的概念
环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数
2. 命令行参数
2.1
2.2 创建 code.c 文件
有选项?
main 函数是可以带命令行参数的,所以可以让我们的各种指令带选项
我们的命令行参数最终就是一个指针数组,所有的命令都是通过我们的main函数参数实现的
2.3 对比 ./code 执行和直接 code 执行
执行我们的命令的时候要带上 ./ ,执行系统命令的时候不需要带 ./ ?
-->
执行我们的命令的时候要带上 ./ :
我们要执行一个程序必须要先找到它
要找到它所以我们运行我们自己的程序时我们要 ./
表明我们要执行的程序在当前路径下
执行系统命令的时候不需要带 ./ :
因为系统当中存在环境变量,来帮助我们找到目标二进制文件
./ 告诉我们路径,不带 ./ 就是在环境变量里面找
2.4 怎么可以不带 ./
2.4.1 把我们的二进制文件拷贝到 usr/bin 路径下,也不用带 ./ 了
这样就可以不带路径让我们的程序运行了
2.4.2 把我们自己的路径添加到环境变量里
把我们自己的路径添加到环境变量里,我们是不是就不用拷贝二进制文件了?二进制文件运行时就能直接被找到了
-->
怎么添加?
-->
如果我们直接给PATH赋值的话,是覆盖的,只会剩下我们赋值的路径,系统路径就没有了
用 :分割的一个一个的子路径就是用来查找可执行程序所对应的路径,把路径一个一个地去遍历查找
-->
怎么添加不会覆盖?
-->
类似于+=
3. 认识PATH
3.1 PATH 指定命令的搜索路径
我们这里看一个环境变量 ,这个环境变量叫做PATH
-->
在系统下是存在的,用来标识一串路径
告诉系统去那些路径下去找二进制文件
env
罗列系统当中所有的环境变量
环境变量是一个变量
-->构成?
名字=内容
怎么可以看一个环境变量的内容?
根据名字来获得环境变量的内容
也可以是 echo $XXX
所以把我们的code拷贝到 usr/bin 路径下就可以直接被找到了
4. 多方面了解环境变量
4.1 从存储的角度理解环境变量
4.1.2 环境变量的值是bash保存起来的
环境变量的值是bash保存起来的,我们执行命令时也是bash来找我们的命令的
一旦我们登陆的时候,系统就会给我们创建一个bash进程,bush必须从系统当中去读取我们的环境变量的信息,然后在bash进程内部形成一张表 ---> 环境变量表(就是一个指针数组的样子)
全都是这同样结构的表所对应的字符串
bash在启动的时候,它会想办法去帮我们在自己bash内部newmalloc出一段空间,然后再给每个环境变量newmalloc出一段空间形成一个二维数组,然后再把环境变量字符串依次拷贝到这个表里面,bash就在内部维护了这张表,所以我们env查的时候就打印了这张表的内容
4.2 环境变量的组织方式:
每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以 ’\0‘ 结尾的环境字符串
4.3 环境变量,最开始从哪里来的?
是从系统的配置文件中来的
4.4 如果Linux系统中有10个用户登陆?
10个bash
这10个bash进程每一个都要从配置文件中读到自己的bash上下文里
所以每一个bash里面都存在两张表
指令的查找工作是由bash自己完成的
执行一个程序要先找到它-->bash找-->通过 PATH(环境变量)来找
5. 认识更多环境变量
HOME
其他环境变量 HOME
当前用户所对应的家目录
bash所形成的环境变量表里面就有一个环境变量叫做HOME
SHELL :
当前Shell,通常是/bin/bash
HISTSIZE
记录1000条我们对应的环境变量
HOSTNAME
我们当前主机的主机名
PWD
6. 获取环境变量的方法
6.1 操作:
env 查看所有环境变量
echo $XXX 查看某个环境变量的内容
export 设置一个新的环境变量
export 变量名=值
unset 清除环境变量
unset 变量名
6.2 代码获取环境变量
6.2.1 方法1:main 函数获取环境变量
6.2.2 方法2: getenv 可以获得指定环境变量的内容
6.2.3 方法3:通过第三方变量 environ 获取
环境变量表是char*的
要指向char* 就要是char**
libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件里,所以在使用时要用extern声明
7.理解环境变量的特性
7.1 环境变量具有全局特性
7.1.1 环境变量可以被子进程继承
环境变量在系统中通常具有全局特性
导出为环境变量(导入到父进程)
7.1.2 环境变量可以被子进程继承 ,为什么?
因为我们可以把环境变量的相关信息让子进程继承下去,子进程就可以结合环境变量来做个性化操作
7.1.2.1 我们这里写一个程序只允许我们自己执行
想写一个程序只允许我们一个人使用 ,怎么做?
只有bash知道我们当前的登陆用户是谁
7.2 补充:
7.2.1 : 本地变量
本地变量不会被子进程继承,只在bash内部被使用
env不会显示本地变量
set 会显示环境变量和本地变量
bash 会记录两套变量,环境变量和本地变量
7.2.1.1 本地变量在bash内部具有一定的功能性
很多本地变量在bash内部具有一定的功能性,按照我们的期望输出一些格式
7.2.1.2 eg:续行
因为 我们 set 之后,可以找到这个本地变量的
unset 变量名
7.2.2 可以export导出为环境变量,env就可以显示了
-->
7.2.2.1 内建命令
我们的环境变量是在bash里面,bash里的环境变量可以由子进程继承
我们export怎么可以给bash?
export是一个特殊命令 --> 内建命令 这种命令执行时不需要创建子进程,而是让bash自己执行(bash自己调用函数,或者系统调用完成)