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

目录

 ​编辑

环境变量的概念:

  小插曲: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中,就需要通过.来自定当前的路劲。

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

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

相关文章

husky,commit规范,生成CHANGELOG.md,npm发版

项目git提交工程化&#xff08;钩子&#xff0c;提交信息commit message&#xff09;&#xff0c;npm修改版本&#xff0c;需要涉及到的包&#xff1a; husky&#xff0c;允许在git钩子中执行不同的脚步&#xff0c;如commitlint&#xff0c;eslint&#xff0c;prettier&#…

基于Python的飞机大战复现

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

【趣味】斗破苍穹修炼文字游戏HTML,CSS,JS

目录 图片展示 游戏功能 扩展功能 完整代码 实现一个简单的斗破苍穹修炼文字游戏&#xff0c;你可以使用HTML、CSS和JavaScript结合来构建游戏的界面和逻辑。以下是一个简化版的游戏框架示例&#xff0c;其中包含玩家修炼的过程、增加修炼进度和显示经验值的基本功能。 图片…

005 MATLAB符号微积分

前言&#xff1a; 在MATLAB中&#xff0c;数值与符号的主要区别在于它们的处理方式和应用场景 数值计算适用于实际的数值计算问题&#xff0c;如矩阵运算、数据分析等。符号计算适用于符号推导、公式化简和符号解析&#xff0c;如理论物理和工程计算。 01 符号对象 1.基本符…

Android 13 编译Android Studio版本的Launcher3

Android 13 Aosp源码 源码版本Android Studio版本Launcher3QuickStepLib (主要代码) Launcher3ResLib(主要资源)Launcher3IconLoaderLib(图

Ubuntu交叉编译 opencv for QNX

前言 在高通板子上开发一些程序的时候,会用到opencv帮助处理一下图像数据,高通车载板子sa8155和sm8295都有QNX os,需要交叉编译opencv的库,(这个交叉编译真是搞得我太恶心了,所以进行一个记录和分享) 搜了很多资料,有些太过于复杂,有些也存在错误导致最后没有编译成…

NVR监测软件EasyNVR多个NVR同时管理:录播主机的5条常见问题与解决办法

视频监控广泛应用于城市治安、交通管理、商业安保及家庭监控等领域。在使用EasyNVR平台管理多个NVR设备时&#xff0c;尤其是涉及到海康录播主机的场景中&#xff0c;使用者可能会遇到一些常见问题。本文将探讨海康录播主机的五个常见问题及其解决办法。 1、海康录播主机的5条常…

力扣刷题TOP101:6.BM7 链表中环的入口结点

目录&#xff1a; 目的 思路 复杂度 记忆秘诀 python代码 目的 {1,2},{3,4,5}, 3 是环入口。 思路 这个任务是找到带环链表的环入口。可以看作是上一题龟兔赛跑&#xff08;Floyd 判圈算法&#xff09;的延续版&#xff1a;乌龟愤愤不平地举报兔子跑得太快&#xff0c;偷偷…

网关: 用途和产品对比

概述 微服务中的有一个非常关键的组件: API网关 和配置中心一样&#xff0c;在没有采用微服务架构的时候 我们可以自己搭建自己的API网作作为统一的 API 出口和安全验证 在微服务架构之下&#xff0c;服务被拆的非常的零散&#xff0c;在降低了耦合度的同时 也给服务的统一…

Java ConcurrentHashMap

Java Map本质不是线程安全的&#xff0c;HashTable和Collections同步包装器&#xff08;Synchronized Wrapper&#xff09;在并发场景下性能低。Java还为实现 Map 的线程安全提供了并发包&#xff0c;保证线程安全的方式从synchronize简单方式到精细化&#xff0c;比如Concurre…

Spring 自调用事务失效分析及解决办法

前言 博主在写公司需求的时候&#xff0c;有一个操作涉及到多次对数据库数据的修改。当时就想着要加 Transactional注解来声名事务。并且由于一个方法中有太多行了&#xff0c;于是就想着修改数据库的操作单独提取出来抽象成一个方法。但这个时候&#xff0c;IDEA 提示我自调用…

【LeetCode每日一题】——189.轮转数组

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【题目进阶】八【解题思路】九【时空频度】十【代码实现】十一【提交结果】 一【题目类别】 数组 二【题目难度】 中等 三【题目编号】 189.轮转数组 四【题目描述】 …

Spark基本命令详解

文章目录 Spark基本命令详解一、引言二、Spark Core 基本命令1、Transformations&#xff08;转换操作&#xff09;1.1、groupBy(func)1.2、filter(func) 2、Actions&#xff08;动作操作&#xff09;2.1、distinct([numTasks])2.2、sortBy(func, [ascending], [numTasks]) 三、…

AppFlow:支持飞书机器人调用百炼应用

AppFlow&#xff1a;支持飞书机器人调用百炼应用 简介&#xff1a; 本文介绍了如何创建并配置飞书应用及机器人&#xff0c;包括登录飞书开发者后台创建应用、添加应用能力和API权限&#xff0c;以及通过AppFlow连接流集成阿里云百炼服务&#xff0c;最后详细说明了如何将机器…

基于vite创建一个脚手架(快速入门)

Vite是一种新型的前端构建工具&#xff0c;主要用于构建现代化的Web应用程序。以 原生ESM 方式提供源码。这实际上是让浏览器接管了打包程序的部分工作&#xff1a;Vite 只需要在浏览器请求源码时进行转换并按需提供源码。根据情景动态导入代码&#xff0c;即只在当前屏幕上实际…

学习ASP.NET Core的身份认证(基于Session的身份认证1)

ASP.NET Core使用Session也可以实现身份认证&#xff0c;关于Session的介绍请见参考文献5。基于Session的身份认证大致原理就是用户验证成功后将用户信息保存到Session中&#xff0c;然后在其它控制器中从Session中获取用户信息&#xff0c;用户退出时清空Session数据。百度基于…

视觉语言模型(VLM)学习笔记

目录 应用场景举例 VLM 的总体架构包括&#xff1a; 深度解析&#xff1a;图像编码器的实现 图像编码器&#xff1a;视觉 Transformer 注意力机制 视觉-语言投影器 综合实现 训练及注意事项 总结 应用场景举例 基于文本的图像生成或编辑&#xff1a;你输入 “生成一张…

spider--某站搜索--自动化dp

免责声明&#xff1a;本文仅作分享&#xff01; 自动化&#xff1a; DrissionPage DrissionPage官网 import time from DrissionPage import ChromiumPage,ChromiumOptions import pandas as pd# 这里配置了浏览器路径&#xff0c;不配置的话直接 page ChromiumPage() co Ch…

学成在线day07

视频处理 技术方案 掌握了xxl-job的分片广播调度方式&#xff0c;下边思考如何分布式去执行学成在线平台中的视频处理任务。 任务添加成功后&#xff0c;对于要处理的任务会添加到待处理任务表中&#xff0c;现在启动多个执行器实例去查询这些待处理任务&#xff0c;此时如何…

vsftpd 的安装和应用(超详细!!!)

FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在计算机网络上进行文件传输的标准协议。它允许用户从一台计算机向另一台计算机上传或下载文件。FTP的工作原理涉及到客户端和服务器之间的交互&#xff0c;以及数据传输的过程。 一、FT…