环境变量小节

        这是写的第二篇环境变量博客,写了一年多了,第一次出现把自己博客删了的情况,不知道为什么明明发表了,然后就把草稿箱和回收站的删了,结果晚上发现没发表,回收站删除是无法找回的,以后还是要慎重点。

一 常见环境变量

        1 PATH

        为什么我们在执行自己的可执行程序时往往要带上路径呢? 为什么执行ls指令就不用带路径呢?其实就是环境变量PATH的原因,我们打印看看PATH里面发现有很多路径。

     其中有个路径是/usr/bin恰好就是ls可执行文件所在的位置,实际上就是ls这些指令会默认去PATH中的路径查找文件,而我们的文件的路径不在其中,所以必须告诉bash路径,才能去执行。

  

        那如何添加呢,如下:但如果是PATH=/home/hqy,则会覆盖里面的路径。

如下,我们自己的test2这个可执行程序就可以不带路径了,但是有点奇怪的是有一个test文件却还是要带路径执行。

2 HOME

        每次我们登录上shell的时候,我们就默认到了某个目录下,这个目录其实称为家目录,而这个家目录就是HOME维护的,每次登录时bash自动cd到这个目录下。

3 其余环境变量

        env就可以显示所有的环境变量。

        HISTSIZE=3000,指的是会保留历史上使用过的指令,最多三千条,这个挺好用的,用<-和->就可以找指令,有时候还挺方便的。USER=hqy这个保存的是当前用户名,还有那个一大团的是ls的配色方案,所以ls显示出的目录,可执行程序会带颜色。

4 和环境变量相关的指令

export 加上变量名会增加一个环境变量,unset则会删除,至于env则是显示全部的环境变量。

二 环境变量和进程

        环境变量并不是凭空冒出来的,它其实已经存在我们身边很久了,这就得先说说main函数的参数了。main函数其实是有参数的,诶那为什么我没写过形参,不报错呢?简单理解就是main函数其实是被进程起的CRT_Start()等函数调用的,或许进程在用CRT_start()函数调用main函数时,提前看了看你有没有写参数,没写,那我就不传,写了,我就传参。

        那main函数的参数究竟是什么呢?我们运行一下test这个程序。

        先前已经在初识父子进程中提过,./test其实是bash起了个子进程去执行代码,bash会先对我们输入的指令做解析,按空格分割成一个一个的字符串,然后存到一个指针数组中,最后传给main函数的argv参数,而argc则是分割后的字符串个数。

        诶,我好好./test运行我的可执行程序不行吗,我好端端输入-a -l -b干嘛,回忆下ls命令,ls可以执行,ls -a -l也可以执行,但是ls -a -l和ls执行的是不同的代码,我们将"ls" "-a" "-l" 称为命令行参数,而-a -l则是选项,这个参数就是为了在ls代码块判断,然后执行不同的代码,显示不同的信息,如下图:

        这就是选项的意义,而argv数组就是用来支持选项的。到了后面实现shell的时候,我们就能理解指令带ls的用处,以及带-a -l的作用。

        而环境变量就和第三个参数env有关,它内部又是什么呢?我们打印看看。

        原来是环境变量,可是我本来就能用getenv获取环境变量啊,再传个这个参数给我干什么呢?其实这个是为了后面我们可能想要用自己的环境变量表,就设置了这么一个参数,用来接收,怎么传要到程序替换再提及。

三 其余概念补充

1 全局属性

        bash的环境变量具有全局属性:嘶,这句话如何理解呢?我们之前说./test这样运行的可执行程序是bash的子进程,这个子进程共享父进程的代码和数据,环境变量实质上也是数据,所以子进程也能用,这就是为什么子进程getenv可以看到bash的环境变量的原因。测试如下,我们给bash导入一个环境变量,然后看看子进程有没有继承到。

导入成功了,./test运行下,看看有没有。

        有,说明猜想正确。而所有我们在shell运行的程序都是bash的子进程或者子进程的子进程,这样不断地父传子,最后所有的进程如果不修改,那就都能看到bash的环境变量,这就是全局属性。

2 本地变量和环境变量

        还有种变量称为本地变量,本地变量并不会被子进程所继承,只能给当前进程使用。MAX=11111111111111这个就是定义一个本地变量,我们env一下就会发现,环境变量表中没有这个MAX变量,子进程也看不到。

3 内建命令介绍

        有些指令其实是不适合让bash去起子进程执行的,简单理解内建命令就是bash内的一个函数,没有fork子进程去执行代码。

        1 cd命令

             cd命令是改变进程的工作目录cwd,而环境变量PWD是改变后顺便更新的,如果这个时候起了子进程去chdir,这个时候就变成改变子目录的cwd了,测试cd 是改变cwd得会用程序替换才可以复现实验,具体就是我分别用chdir和getenv("PWD")分别改变工作目录和环境变量,再用ls指令替换后面的代码,我们会发现,ls显示的目录的信息是随着chdir改变的,而与是否改变环境变量无关。

        2 echo命令

            为什么说echo命令也是呢,就是因为shell的echo可以打印本地变量,如果bash创建了子进程去执行,是无法打印bash的本地变量的,不过我们在系统路径下却可以找到一个echo的可执行程序,不是说是个函数吗,怎么还有个可执行文件呢?个人感觉echo在打印时会做判断,在打印本地变量时不会创建子进程,但是有时候却会创建子进程,例如重定向的时候。

 

        3 export命令

        MAX=11111111111111这样只是定义一个本地变量,要想定义一个环境变量,得用export变量,而且export肯定是给bash导入的,如果创建子进程导入环境变量,会发生写时拷贝,这样就不是给bash导入的了,诶,我就不想给bash导,如果export是给子进程导,那有一天我想给bash导入呢,难道给bash创建个父进程吗。

       后面在进程部分,环境变量也起到不小的作用,后续使用再介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/140256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统架构设计】架构核心知识: 2.3 UML图

目录 一 UML 1 用例图 2 类图/对象图关系 3 活动图 4 顺序图 5 通信图

使用Python自动检测SSL证书是否过期

目录 一、概述 二、SSL证书过期检测原理 三、Python实现SSL证书过期检测 四、注意事项 总结 一、概述 随着互联网的普及和安全意识的提高&#xff0c;SSL证书的使用变得越来越重要。SSL证书可以提供加密通信&#xff0c;保护用户的数据安全&#xff0c;防止中间人攻击等。…

安卓Frida 常用脚本

打印调用堆栈, hook 某个方法,想看下调用堆栈,代码如下: function showStacks() {Java.perform(function () {send(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()));});} 二,需要hook okhttp3 HttpUrl …

震裕科技-300953 三季报分析(20231108)

震裕科技-300953 基本情况 公司名称&#xff1a;宁波震裕科技股份有限公司 A股简称&#xff1a;震裕科技 成立日期&#xff1a;1994-10-18 上市日期&#xff1a;2021-03-18 所属行业&#xff1a;专用设备制造业 周期性&#xff1a;0 主营业务&#xff1a;精密级进冲压模具及下游…

VPP节点统计信息

节点的统计位于函数dispatch_node函数中&#xff0c;节点处理函数运行之后&#xff08;node->function&#xff09;返回值为处理的报文数量n&#xff08;n_vectors&#xff09;&#xff0c;通过函数vlib_node_runtime_update_stats来更新节点的相关统计信息。 static_alway…

搭建Docker

一、概念 云服务器大家肯定不陌生了&#xff0c;相比较传统物理服务器来说他的价格&#xff0c;个性化的配置服务&#xff0c;节省了很多的运维成本&#xff0c;越来越多的企业以及个人开发者更加的青睐于云服务器。有了属于自己的服务器就可以部署搭建自己个人网站了&#xf…

mac安装brew

命令 /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"如图 选择下载源&#xff0c;进行安装 安装完成 验证

安卓常见设计模式9------外观模式(Kotlin版)

1. W1 是什么&#xff0c;什么是外观模式&#xff1f;​ 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个简单的接口&#xff0c;用于隐藏底层系统的复杂性&#xff0c;并将其封装成一个更高级别的接口供客户端使用。外观模式有…

Java基础知识第四讲:Java 基础 - 深入理解泛型机制

Java 基础 - 深入理解泛型机制 背景&#xff1a;Java泛型这个特性是从JDK 1.5才开始加入的&#xff0c;为了兼容之前的版本&#xff0c;Java泛型的实现采取了“伪泛型”的策略&#xff0c;即Java在语法上支持泛型&#xff0c;但是在编译阶段会进行所谓的“类型擦除”&#xff0…

Linux--gcc/g++

一、gcc/g是什么 gcc的全称是GNU Compiler Collection&#xff0c;它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器&#xff08;GNU C Compiler&#xff09;&#xff0c;现在除了c语言&#xff0c;还支持C、java、Pascal等语言。gcc支持多种硬件平台 二、gc…

C++(20):自定义类型的自定义结构化绑定

C++17引入了map,tuple等类型的结构化绑定,不过有些限制 C++(17):结构化绑定_c++17结构化绑定_风静如云的博客-CSDN博客 C++20允许定制自定义类的结构化绑定,不过需要满足几个条件: 1.在类外实现get<int>(Type)函数、或在类内实现Type::get<int>()成员函数 2…

用示波器测量高压电

示波器本身是不可以测试几千v的高压电电路的&#xff0c;一般自带的探头衰减倍数不够&#xff0c;需要使用高压差分探头或者高压探棒&#xff0c;将测试信号衰减到合适的范围再接入示波器。 普通探头能测差分电压吗&#xff1f;差分探头和普通探头有什么区别&#xff1f;全网最…

NameServer的作用及功能

NameServer是整个消息队列中的状态服务器&#xff0c;集群的各个组件通过它来了解全局的信息。同时&#xff0c;各个角色的机器都要定期向NameServer上报自己的状态&#xff0c;超时不上报的话&#xff0c;NameServer会认为某个机器出故障不可用了&#xff0c;其他的组件会把这…

同一台Linux同时安装MYSQL5.7和MYSQL8(第一篇)

在一台Linxu上面同时安装mysql5.7和mysql8.0的步骤&#xff0c;记录一下&#xff0c;方便后续回顾&#xff0c;后续文章之后会接着介绍搭建两台虚拟机一主一从的架构。 其中配置的文件名称、目录、端口号、IP地址要根据自己电脑的实际情况进行更改。 安装完成后效果 [rootzong…

精确杂草控制植物检测模型的改进推广

Improved generalization of a plant-detection model for precision weed control 摘要1、介绍2、结论摘要 植物检测模型缺乏普遍性是阻碍实现自主杂草控制系统的主要挑战之一。 本文研究了训练和测试数据集分布对植物检测模型泛化误差的影响,并使用增量训练来减小泛化误差。…

vmware workstation 与 device/credential guard 不兼容

VM虚拟机报错 vmware虚拟机启动时报错&#xff1a;vmware workstation 与 device/credential guard 不兼容&#xff1a; 系统是win10专业版&#xff0c;导致报错原因最终发现是安装了docker&#xff0c;docker自带下载虚拟机Hyper-V&#xff0c;而导致vmware workstation 与 …

web-worker 基本使用

Web Workers 是浏览器中的一项技术&#xff0c;它允许在独立的线程中运行 JavaScript 代码&#xff0c;从而避免主线程阻塞。这对于执行长时间运行的计算、处理大量数据或执行其他 CPU 密集型任务非常有用。下面是一个简单的使用 Web Workers 的示例&#xff0c;包括主线程和工…

华为L410上制作内网镜像模板01

原文链接&#xff1a;华为L410上制作离线安装软件模板01 hello&#xff0c;大家好啊&#xff0c;今天给大家带来一篇在内网搭建Apache服务器&#xff0c;用于安装完内网操作系统后&#xff0c;在第一次开机时候&#xff0c;为系统安装软件&#xff0c;今天给大家用WeChat举例&a…

Qt绘制饼状图

必须在MainWindow.h头文件开头放 #include <QtCharts> //必须这么设置 创建chart&#xff1a; void MainWindow::iniPiewChart() { //饼图初始化QChart *chart new QChart();chart->setTitle(" Piechart演示");chart->setAnimationOptions(QChar…

数据分析实战 | 贝叶斯分类算法——病例自动诊断分析

目录 一、数据及分析对象 二、目的及分析任务 三、方法及工具 四、数据读入 五、数据理解 六、数据准备 七、模型训练 八、模型评价 九、模型调参 十、模型预测 一、数据及分析对象 CSV文件——“bc_data.csv” 数据集链接&#xff1a;https://download.csdn.net/d…