当前位置: 首页 > article >正文

环境变量的知识

目录

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 之后,可以找到这个本地变量的

7.2.2 可以export导出为环境变量,env就可以显示了

-->

7.2.2.1 内建命令

我们的环境变量是在bash里面,bash里的环境变量可以由子进程继承

我们export怎么可以给bash?

export是一个特殊命令 --> 内建命令   这种命令执行时不需要创建子进程,而是让bash自己执行(bash自己调用函数,或者系统调用完成)


http://www.kler.cn/a/441540.html

相关文章:

  • 土壤墒情中土壤 pH 值的监测方法与意义
  • 开发环境搭建-1:配置 WSL (类 centos 的 oracle linux 官方镜像)
  • 通过视觉语言模型蒸馏进行 3D 形状零件分割
  • javaweb之HTML
  • 2.2.1 语句结构
  • Bigemap pro批量设置属性/填充字段
  • 【WPF】把DockPanel的内容生成图像
  • C#网络编程--TCP/IP协议与Socket的区别以及关系
  • GESP CCF python一级编程等级考试认证真题 2024年12月
  • 【CSS in Depth 2 精译_080】 13.1:CSS 渐变效果(中)——不同色彩空间的颜色插值算法在 CSS 渐变中的应用
  • 【081】基于51单片机智能家居语音控制系统【Proteus仿真+Keil程序+报告+原理图】
  • React 前端框架入门教学
  • Redis--背景知识
  • C语言实验 函数二
  • Dockerfile制作相关命令
  • Ruyi-Mini-7B:开源的图像生成视频模型
  • 利用SpringAOP的返回通知处理数据加密返回
  • vulnhub靶场【DriftingBlues】之5
  • 12.16【net】[debug]SOCKET_RAW无法在热点局域网下传递,悬而未决
  • Android-Glide详解二
  • git如何撤销最近一个或几个提交
  • Redisson常用方法
  • 如何解决手机,电脑等工作室同ip关联问题
  • Springboot3.x配置类(Configuration)和单元测试
  • MySQL--》解析事务从隔离级别到死锁处理
  • Redis在库存里的应用