环境变量小节

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

一 常见环境变量

        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创建个父进程吗。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git基础知识

1.git的必要配置 所有的配置文件&#xff0c;其实都保存在本地&#xff01; 查看所有配置 git config -l 即把 系统配置(system)和当前用户&#xff08;global&#xff09;配置都 列出来 以直接编辑配置文件&#xff0c;通过命令设置后会响应到这里。 注意&#xff1a; 如果…

传统测试将被取代?AI测试现状及发展之思

近年来&#xff0c;我一直关注AI相关的测试&#xff0c;并积极参与多个全国性测试社区和社群。在这些社区中&#xff0c;我与不同公司和领域的测试专家交流探讨AI测试相关话题&#xff0c;包括业界顶尖公司的专家和国内知名测试学者。我也参加了多个大会&#xff0c;聆听了许多…

B087-人力资源项目-文件上传课程分类

目录 背景控制台操作开通OSS服务创建存储空间 项目工程准备概述新建文件管理模块把文件上传到OSS的三种方案 通过官方文档完成demo上传官方文档找JavaSDK文件上传思路代码 背景 为什么要交给第三方文件管理服务管理&#xff1f; 最传统的的文件管理方案是把文件存储到项目中本…

半小时拥有自己的ChatGPT4,高效低成本,无脑跟即可

文章目录 一、获取Key二、获取服务器三、设置端口三、安装Docker环境 一、获取Key 最简单的获取方法&#xff0c;去某宝搜 “open账号ai” 购入一个key&#xff0c;几块钱&#xff0c;有3.5、4.0&#xff0c;买3.5就行了&#xff0c;4.0太贵了。注意是购入key&#xff0c;不是…

Elasticsearch 和 Go 中使用向量搜索寻找地鼠

作者&#xff1a;CARLY RICHMOND&#xff0c;LAURENT SAINT-FLIX 就像动物和编程语言一样&#xff0c;搜索也经历了不同实践的演变&#xff0c;很难在其中做出选择。 加入我们的第二部分&#xff0c;通过 Elasticsearch 中的矢量搜索在 Go 中狩猎地鼠&#xff08;gophers&…

Install Docker in Linux

Docker官网链接: https://docs.docker.com/ 1.确定Linux版本 新版本的Docker对Linux系统版本有一定的要求。如果Linux的发行版系统是centOS&#xff0c;安装最新版的docker需要centOS 7以上的系统。 在Docker安装帮助页面查看支持的系统版本。 Docker帮助页面:https://docs…

13 套接字Socket

1、Socket 编程 socket编程基于 TCP 和 UDP 协议的tcp和udp是区分客户端和服务端的&#xff0c;所以我们的socket编程也是区分的。 2、socket是端到端的通信 1.Socket 这个名字很有意思&#xff0c;可以作插口或者插槽讲 2.一头插在客户端&#xff0c;一头插在服务端&#x…

拉晶工艺设备——切片机

单晶炉拉出硅棒后&#xff0c;经硅棒切断、外园整形&#xff0c;便用切片机切成薄片&#xff0c;供后续工艺使用。切片机也用于玻璃、陶瓷、 大理石、花岗岩等硬脆材料的切割。 半导体行业使用的切片机按结构形式可分为立式切片机、卧式切片机&#xff0c;按刀片形式可分内圆切…

魔众文库系统 v5.5.0 批量快捷上传,文档图标优化,档转换逻辑优化

魔众文库系统基于文档系统知识&#xff0c;建立平台与领域&#xff0c;打造流量、用户、付费和变现的闭环&#xff0c;帮助您更好的搭建文库系统。 魔众文库系统发布v5.5.0版本&#xff0c;新功能和Bug修复累计14项&#xff0c;批量快捷上传&#xff0c;文档图标优化&#xff…

酷柚易汛ERP - 套餐管理操作指南

1、应用场景 套餐管理应用于商品打包销售&#xff0c;如临期食品&#xff0c;促销商品等 2、主要操作 2.1 新增套餐 打开【资料】-【套餐管理】点击新增 套餐是一个组合新商品出现&#xff0c;价格需要重新设定&#xff0c;也可以设定不同等级客户对应价格

SAP ABAP基础语法-Excel上传(十)

EXCEL BDS模板上传及赋值 上传模板事务代码&#xff1a;OAER l 功能代码&#xff1a;向EXCEL模板中写入数据示例代码如下 REPORT ZEXCEL_DOI. “doi type pools TYPE-POOLS: soi. *SAP Desktop Office Integration Interfaces DATA: container TYPE REF TO cl_gui_custom_c…

arduino 简易智能花盆

编辑器&#xff1a;arduino IDE 主板&#xff1a;arduino uno 传感器&#xff1a; 0.96寸的OLED屏&#xff08;四脚&#xff09; 声音模块 土壤温湿度模块 DS18B20温度模块&#xff08;这里用到防水的&#xff09; 光敏电阻模块&#xff08;买成三脚的了只能显示高低&#x…

软件测试的终点是“测试开发”吗?

前言 在一线大厂&#xff0c;没有测试这个岗位&#xff0c;只有测开这个岗位&#xff0c;即使是做业务测试&#xff0c;那么你的title也是测开。 所以想聊一聊测开的看法&#xff0c;但不代表这是正确的看法&#xff0c;仅供参考。 没来阿里之前我对测开的看法 一直以为专职做自…

软件测试金融项目,在测试的时候一定要避开的一些雷区

软件测试金融项目需要格外谨慎和专注&#xff0c;因为这些项目通常涉及大量的交易、用户隐私和其他敏感信息。以下是一些软件测试金融项目时需要关注的方面&#xff1a; 1. 数据保护 在测试金融项目时&#xff0c;必须确保用户数据和投资信息得到保护。测试人员必须确保测试环…

我干了8年测试,告诉你现在软件测试还能不能找到工作!

观点&#xff1a;如果你还是以前的思维来学习测试&#xff0c;那你肯定是找不到工作&#xff01; 我做测试工作有将近8年的时间&#xff0c;蚂蚁金服做过2年&#xff0c;因为加班太多离职了。目前在一家国企上市公司&#xff0c;一年能拿三四十个左右&#xff0c;对比头部互联…

信息系统“好用”的标准探讨

数字化转型建设的关键不在建设信息系统。这是为了避免走信息化建设的老路——业务和信息化两张皮&#xff0c;寄希望信息系统解决业务问题。在数字化转型建设中&#xff0c;信息系统仍然是重要抓手和显性成果&#xff0c;是企业业务和数据的承载平台&#xff0c;也是IT厂商向客…

李峋同款的C语言动态爱心代码来了,彩色闪动,附源码

1.前言 最近一部电视剧《点燃我&#xff0c;温暖你》可火啦&#xff0c;大家纷纷在搞男主阿瑟的同款爱心代码&#xff0c;但是虽然网上有它的源码&#xff0c;但都不是 C 语言的&#xff0c;看不懂。我看了一下这个视频&#xff0c;大致分析了一下它的运行过程。用语言描述一下…

【C++】C++11常用特性梳理

C11特性梳理 1. 列表初始化2. auto & decltype3. 右值引用3.1. 左右值引用比较3.2. 右值引用的意义3.3. 万能引用与完美转发3.4. 移动构造与移动赋值 4. default & delete5. 可变参数模板6. push_back 与 emplace_back7. lambda表达式7.1. 捕捉列表 8. function包装器8…

(一)QML加载离线地图+标记坐标点

1、实现效果 加载离线地图瓦片、鼠标拖拽、滚轮缩放在地图上固定坐标位置标注地名 &#xff08;一&#xff09;QML加载离线地图标记坐标点&#xff1a;MiniMap-mini 2、实现方法 2.1、使用工具下载离线地图 不废话&#xff0c;直接搬别人的砖&#xff0c;曰&#xff1a;他山…

VirtualBox网络地址转换(NAT),宿主机无法访问虚拟机的问题

问题&#xff1a;NAT模式下&#xff0c;默认只能从内访问外面&#xff0c;而不能从外部访问里面&#xff0c;所以只能单向ping通&#xff0c;虚拟机的ip只是内部ip。 PS&#xff1a;桥接则是与主机公用网卡&#xff0c;有独立的外部ip。 解决&#xff1a;NAT模式可以通过配置 …