环境变量小节

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

一 常见环境变量

        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.rhkb.cn/news/192024.html

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

相关文章

macOS Big Sur(macos11版本)

macOS Big Sur是苹果推出的最新操作系统&#xff0c;具有以下特点&#xff1a; 全新的设计风格&#xff1a;Big Sur采用了全新的设计语言&#xff0c;包括更加圆润的窗口和控件、更加鲜明的色彩和更加简洁的界面。这种设计风格使得操作系统更加美观和易用。强大的性能表现&…

“糖尿病日”感言

长期旺盛的写作欲&#xff0c;今天忽地就莫名其妙地衰退下来了。感到浑身都不舒服&#xff0c;特别是过去从未出现过的腰微痛、乏力现象发生了。 转念一想&#xff0c;或是老龄人一日不如一日的正常反应吧&#xff1f;而且&#xff0c;今天恰逢“ 联合国糖尿病日”&#xff0c…

Python之文件与文件夹操作及 pytest 测试习题

目录 1、文本文件读写基础。编写程序&#xff0c;在 当前目录下创建一个文本文件 test.txt&#xff0c;并向其中写入字符串 hello world。2、编写一个程序 demo.py&#xff0c;要求运行该程序后&#xff0c;生成 demo_new.py 文件&#xff0c;其中内容与demo.py 一样&#xff0…

NO.304 二维区域和检索 - 矩阵不可变

题目 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&#xff1a; NumMatrix(int[][] matrix) 给定整数矩阵 …

【Qt之QWizard】使用1

QWizard使用 描述方法枚举&#xff1a;enum QWizard::WizardButton枚举&#xff1a;enum QWizard::WizardOption枚举&#xff1a;enum QWizard::WizardStyle枚举&#xff1a;enum QWizard::WizardPixmap常用成员方法槽函数信号 示例设置标题添加page页设置按钮文本设置自定义按…

房产中介租房小程序系统开发搭建:详细指南教你如何构建

随着微信小程序的日益普及&#xff0c;越来越多的企业和个人开始尝试开发自己的小程序。以下是制作一个房地产微信小程序的详细教程&#xff0c;希望对大家有所帮助。 一、注册登录乔拓云平台&#xff0c;进入后台 首先&#xff0c;需要注册并登录乔拓云平台&#xff0c;该平台…

爬虫,TLS指纹 剖析和绕过

当你欲爬取某网页的信息数据时&#xff0c;发现通过浏览器可正常访问&#xff0c;而通过代码请求失败&#xff0c;换了随机ua头IP等等都没什么用时&#xff0c;有可能识别了你的TLS指纹做了验证。 解决办法&#xff1a; 1、修改 源代码 2、使用第三方库 curl-cffi from curl…

警方打击了大规模网络钓鱼提供商BulletProftLink

导语 最近&#xff0c;马来西亚皇家警察宣布成功打击了一个名为BulletProftLink的大规模网络钓鱼提供商。这个提供超过300个钓鱼模板的平台被查封&#xff0c;给全球网络安全带来了巨大的利好消息。本文将带您了解这个引人注目的行动背后的故事&#xff0c;并揭示BulletProftLi…

密钥安全存储方案探讨与实践

随着信息技术的迅猛发展和应用范围的不断扩大&#xff0c;我们日常生活中的许多方面已经与信息技术密不可分。而在信息安全领域中&#xff0c;密钥的安全存储显得尤为重要。本文将探讨密钥安全存储的必要性、相关技术和实践方案&#xff0c;并提出一些解决方案。 一、密钥安全存…

Nexus的Maven私有仓库搭建

Nexus的maven私有仓库搭建 一、了解 maven仓库设置 默认设置 其中&#xff1a; maven-central: 预定义的代理Maven Central仓库&#xff0c;它包含了大量的开源Java依赖包。maven-public: 存储库是一个组合存储库&#xff0c;它包含了maven-releases和maven-snapshots存储库…

绘制函数图像

import pandas as pd from plotnine import *# 定义自定义函数 def f(x):return x**2# 生成 x 值 x_values range(-10, 11)# 生成对应的 y 值 y_values [f(x) for x in x_values]# 创建数据框 df pd.DataFrame({x: x_values, y: y_values}) # df为&#xff1a;x y 0 -10…

Python入门教程:12个常用基础语法详解

文章目录 前言1.多个字符串组合为一个字符串2. 字符串拆分为子字符串列表3. 统计列表中元素的次数4.使用try-except-else-block模块5. 使用枚举函数得到key/value对6. 检查对象的内存使用情况7. 合并字典8. 计算执行一段代码所花费的时间9. 列表展开10. 列表采样11. 数字化12. …

redis 安装

概览 1.redis下载 1.1.下载Redis 历史版本redis网址&#xff1a;http://download.redis.io/releases/ 建议下载和我一样的版本 6.0.5 将刚才下载好的压缩文件移动到local文件夹内,可以手动移动或者用命令移动 命令行 移动命名&#xff1a;mv 将下载的包拖动到命令行 /usr/loc…

WebGl-Blender:建模 / 想象成形 / 初识 Blender

一、理解Blender 欢迎来到Blender&#xff01;Blender是一款免费开源的3D创作套件。 使用Blender&#xff0c;您可以创建3D可视化效果&#xff0c;例如建模、静态图像&#xff0c;3D动画&#xff0c;VFX&#xff08;视觉特效&#xff09;快照和视频编辑。它非常适合那些受益于…

王道数据结构课后代码题p19 第14题请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a,b,c) 中的最小距离。(c语言代码实现)

本题其实就是找a到c的最小值 有讲解p19 第14题 c语言实现王道数据结构课后代码题_哔哩哔哩_bilibili 下方有图&#xff1a; 本题代码如下 int abs(int a)//计算绝对值 {if (a < 0)return -a;elsereturn a; } int min(int a, int b, int c)//a是否为三个数中的最小值 {if …

使用ant+jmeter如何生成html报告

一、安装ant 下载apache-ant&#xff0c;放到对应路径下&#xff0c;然后进行环境变量配置。系统变量的CLASSPATH添加E:\Installation Pack\eclipse\apache-ant-1.9.6\lib;用户变量的PATH添加&#xff1a;E:\Installation Pack\eclipse\apache-ant-1.9.6\bin。打开cmd&#xf…

【业务场景】长列表的处理

长列表的处理 1. 什么是长列表 在前端开发中&#xff0c;经常会遇到列表展示&#xff0c;如果列表项的数量比较多&#xff0c;我们一般选择采用分页的方式来进行处理 但传统的前后翻页方式只适用于后台的管理系统中&#xff0c;而在用户端、尤其是在移动端&#xff0c;为了保…

基于51单片机PCF8591数字电压表数码管显示设计( proteus仿真+程序+设计报告+讲解视频)

PCF8591数字电压表数码管显示 1.主要功能&#xff1a;讲解视频&#xff1a;2.仿真3. 程序代码4. 设计报告5. 设计资料内容清单&&下载链接资料下载链接&#xff08;可点击&#xff09;&#xff1a; 基于51单片机PCF8591数字电压表数码管设计( proteus仿真程序设计报告讲…

kafka和rocketMq的区别

kafka topic 中每一个分区会有 Leader 与 Follow。Kafka 的内部机制可以保证 topic 某一个分区的 Leader 与 Follow 不在同一台机器上 Leader 节点承担一个分区的读写&#xff0c;Follow 节点只负责数据备份 如果 Leader 分区所在的 Broker 节点宕机&#xff0c;会触发主从节…

【C/C++底层】内存分配:栈区(Stack)与堆区(Heap)

/*** poject * author jUicE_g2R(qq:3406291309)* file 底层内存分配&#xff1a;栈区(Stack)与堆区(Heap)* * language C/C* EDA Base on MVS2022* editor Obsidian&#xff08;黑曜石笔记软件&#xff09;* * copyright 2023* COPYRIGHT …