Linux操作系统学习---初识环境变量

devtools/2024/11/30 10:17:30/

目录

 ​编辑

环境变量的概念:

  小插曲:main函数的第一、二个参数

获取环境变量信息:

  1.main函数的第三个参数

  2.查看单个环境变量

  3.c语言库函数getenv()

  和环境变量相关的操作指令:

  1.export---导出环境变量:

  2.unset---清除环境变量:

  3.env指令

   4.set---显示所有环境变量和本地变量:

环境变量的特性:

  1.可以被子进程继承的全局性:

  2.由bash引入

结尾;


环境变量的概念:

  环境变量的基本格式是 "内容"="内容",中间不能用空格分开。粗略一点来说,他是程序执行时所依赖文件的路径。

  先思考一个问题:为啥我们在运行代码时非得像下面这样加上 ./ ,而执行系统的指令又不用呢(如下图)?这就和今天的环境变量有关了。

  小插曲:main函数的第一、二个参数

  main函数实际可以有三个参数,这里先介绍两个,一个是整形;另一个是字符指针数组(形参名称具体是啥不重要哈),第二个参数也叫命令行参数。

  下面通过例子来帮助理解:main函数的第一个整形参数代码接收指令的个数,第二个字符指针数组参数存放每个指令字符串的首地址。

  可以看到运行 用./code执行这个可执行程序时我象征性的带了四个选项,都被这两个参数记录下来了。由于Linux下的指令大多也是用c语言实现,因此使用的系统指令时可以带各种选项就是通过这个原理来实现的。

  当然这里也有蹊跷,我们自己的程序要加上 ./来指定当前路径运行,而系统的指令(如ls、pwd)等等就不用,这就和环境变量有关。

获取环境变量信息:

  1.main函数的第三个参数

   这里我们补充main函数的第三个参数,它和第二个参数一样也是字符指针数组,不同的是它存放各个环境变量字符串的首地址。

  下面的程序打印出的arr数组的内容很多,都是和刚才的env指令显示一样的环境变量。

  2.查看单个环境变量

  刚才都是一次性显示所有的环境变量,这次咱挑其中一个瞧瞧----它就是环境变量PATH,可以以下方式查看它的内容:

  不难看出就是一堆不同的路径,用 : 来分隔。其实我们在执行一个指令时,命令行解释器bash就会默认到这里面去寻找对应的文件并执行其中的内容,系统级的指令(如ls)就在这些路径中的一个里,而我们自己写的程序则没有,就需要使用 ./ 来告诉bash在当前目录下执行。

  3.c语言库函数getenv()

  c语言<stdlib,h>头文件里有一个getenv函数,原型如下,它接受环境变量名称,返回环境变量内容。

  和环境变量相关的操作指令:

  1.export---导出环境变量:

   格式如下,这样可以自己手动添加环境变量。

  2.unset---清除环境变量:

  格式如下,这样可以删除环境变量。

  

  3.env指令

  运行env后可以看到环境变量的内容还蛮多的,在这里就不展示了,有些一看就知道是啥,有的需要着重了解,可以解开一些之前学习时的疑惑。

   4.set---显示所有环境变量和本地变量:

    set指令相较于env更近一层,不仅显示显示环境变量,还显示本地变量()。

环境变量的特性:

  1.可以被子进程继承的全局性:

  由于子进程创建时会和父进程公用一份代码和数据,所以自然而然环境变量也是共同使用的。下面通过在代码中创建子进程来验证

从上面的代码执行结果可以看到父进程先打印了环境变量(有时候子进程先打印),随后进程进行打印,二者打印的内容相同。

  2.由bash引入

  如果使用上面提到的export向系统里添加自己的环境变量或者删除系统本身的环境变量,接着退出系统后重新进入,就会惊奇的发现环境变量貌似自动初始化了。

  上述情况的发生是因为环境变量是存储在操作系统中的,在打开一个新终端时,bash进程创建,从系统的配置文件里读取环境变量,相当于我们正常情况下访问到的环境变量只是一份拷贝,当退出终端后这种文件就会销毁,下一次登陆时又是新的bash进程从配置文件里读取未改变的环境变量。

结尾;

  通过上面的认知,咱就可以明白为啥运行自己的可执行时为啥要用  ./ ,而运行系统指令就不需要的原因了。因为存在环境变量PATH,其中就包含了系统指令的当前的执行目录,因此bash可以直接找到系统指令的执行路径(如ls的),但我们的程序路径不存在于PATH中,就需要通过.来自定当前的路劲。


http://www.ppmy.cn/devtools/138163.html

相关文章

存储结构及关系(一)

学习目标 描述数据库的逻辑结构列出段类型及其用途列出控制块空间使用的关键字获取存储结构信息 段的类型 段是数据库中占用空间的对象。它们使用数据库数据文件中的空间。介绍不同类型的段。 表 表是在数据库中存储数据的最常用方法。表段用于存储既没有集群也没有分区的表…

zabbix搭建教程

部署服务端 1.安装源rpm -Uvh https://mirrors.aliyun.com/zabbix/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm 2.修改源 修改为阿里云sed -i s#http://repo.zabbix.com#https://mirrors.aliyun.com/zabbix# /etc/yum.repos.d/zabbix.repo 3.清除旧的yum缓…

GoogleTest做单元测试

目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了&#xff0c;解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是&#xff0c;…

基于java web的网上书店系统设计

摘 要 随着互联网的越发普及&#xff0c;网上购物成为了当下流行的热门行为。网络上开店创业有许多的优势&#xff1a;投入少&#xff0c;启动 资金低&#xff0c;交易便捷。网上书店与传统的线下书店比起来优势巨大&#xff0c;网上书店的经营方式和销售渠道是不同与线下书 店…

做异端中的异端 -- Emacs裸奔之路4: 你不需要IDE

确切地说&#xff0c;你不需要在IDE里面编写或者阅读代码。 IDE用于Render资源文件比较合适&#xff0c;但处理文本&#xff0c;并不划算。 这的文本文件&#xff0c;包括源代码&#xff0c;配置文件&#xff0c;文档等非二进制文件。 先说说IDE带的便利: 函数或者变量的自动…

计算机网络八股整理(二)

计算机网络八股整理&#xff08;二&#xff09; 应用层 1&#xff1a;dns的全称了解过吗&#xff1f; dns全称domain-name-system&#xff0c;翻译过来就是域名系统&#xff0c;是在计算机网络中将域名转换成ip地址的分布式数据库系统&#xff1b; 域名服务器的层级类似一个树…

设计模式学习[11]---建造者模式

文章目录 前言1.原理阐述2.举例 总结 前言 建造者模式属于创建型模式&#xff0c;原型模式与工厂模式也归属于这一类。 创建型模式的特点在于&#xff0c;创建新对象&#xff0c;关于创建对象这个概念&#xff0c;在原型模式里面阐述过&#xff0c;创建对象是要深拷贝的&#…

selenium动态判断滚轮方向样例

一、说明及实现方案&#xff1a; 要根据目标元素的位置动态决定是向下滑动还是向上滑动&#xff0c;可以结合 window.pageYOffset 和目标元素的位置来实现逻辑判断。以下是实现代码&#xff1a; from selenium import webdriver from selenium.webdriver.common.by import By…