【Linux】环境变量(初步认识环境变量)

文章目录

  • 1. 环境变量
    • 1.1 基本概念
  • 2. 认识常见环境变量
    • 2.1 PATH
    • 2.2 HOME
    • 2.3 SHELL
    • 2.4 PWD
    • 2.5 USER
  • 3. 理解环境变量

在这里插入图片描述

1. 环境变量

在main函数的命令行参数中,有argc、argv、env三个参数。

  • argc:命令函参数的个数
  • argc:存放每个参数的具体数值

在这里插入图片描述
通过这两个参数,我们可以根据传进来的参数做出判断,来进行相对应的操作,进而达到指令带选项的效果

那第三个参数env是什么呢?- - 环境变量

我们打印出了env中所有的数据,就是环境变量。
在这里插入图片描述

1.1 基本概念

环境变量(environment variables):一般是指在操作系统中用来指定操作系统运行环境的一些参数,将来会以shell的形式传递给所有进程,每个进程都会认识这些参数。

  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,而且在系统当中通常具有全局特性。

常见的环境变量有哪些呢?

使用命令env可显示shell自己的环境变量。
在这里插入图片描述

2. 认识常见环境变量

2.1 PATH

PATH:指定命令的搜索路径

大家在敲指令的时候有没有过这样的问题:为什么我自己写的可执行程序执行时要 ./ 指定路径,而执行系统命令时就不用带指定路径呢?

系统在执行指令的时候会去/usr/bin路径下去找
在这里插入图片描述

但是系统为什么会知道命令在/usr/bin路径下呢?
在shell登录的时候,环境变量PATH告诉shell去哪个路径下去查。

  • 使用 echo 命令可以显示某一个环境变量 echo $PATH
    在这里插入图片描述
  • PATH中包含多个路径,以冒号作为分隔符

因此,在shell运行某个命令时,它首先会去PATH中以冒号作为分隔的多个路径下去查找命令。当把PATH中所要求的路径全部找完,依旧没有找到的情况下,就会报出command not found;一旦在任意路径下找到命令,就会将命令加载并执行。

所以我们在执行系统命令时不需要指定/usr/bin路径,它会自己去PATH中找。

当我们把自己的可执行文件的路径添加到PATH中时,我们执行时也就不需要再带路径了

所以可以这样:PATH = $PATH(原有路径) : 我的路径,将自己的路径添加到PATH中。

在这里插入图片描述
但是一旦退出shell,我们所添加的路径就没有了。

所以,PATH的本质:就是一个内存层次的变量,在shell中被维护起来,一旦shell退出再登录,该PATH就不会是我们修改后了,恢复成原有路径了。

那么PATH中最开始的内容是从哪里来的呢?

shell登陆时,会从系统和用户的配置文件中读取对应的环境变量的配置文件,然后形成自己的环境变量表。

所以我们可以将路径添加到配置文件中(家目录下的bashrc)。
在这里插入图片描述

2.2 HOME

HOME:当前用户所对应的家目录(即用户登陆到Linux系统中时,默认的目录)

当我们使用不同的用户登录的时候,系统要创建bash给我们做准备,bash要读取相关的配置文件来初始化PATH、HOME,所以我们登陆时会默认处在家目录下。

bash也是一个进程,所以它有自己的cwd,它就会使用配置好的HOME设置自己的cwd。
在这里插入图片描述

命令行执行的命令,都是bash的子进程,那子进程的task_struct从哪里来呢? - - 拷贝自父进程,所以子进程的cwd也就会继承bash当前的工作路径。

如果bash在不同的工作路径下,当它创建子进程时,路径就会被子进程继承,所以在查看子进程的路径时也会发生变化,子进程所有的操作都是在所继承下来的路径中

在这里插入图片描述

2.3 SHELL

SHELL : 登录时,启动的是哪一个Shell,它的值通常是/bin/bash

2.4 PWD

PW:用于保存当前进程所在的工作路径

除了使用命令函参数获取环境变量以外,还使用系统方式获取环境变量:getenv()
在这里插入图片描述
在这里插入图片描述

为什么要获得该环境变量呢?- - 进程可获得自己的PWD,可用于新建或打开当前路径下的文件

2.5 USER

USER:当前的用户身份
在这里插入图片描述
此时我们就可以在程序中使用getenv(“USER”)来识别用户身份。

环境变量还有很多,后续慢慢介绍。

3. 理解环境变量

  1. 环境变量的本质

其实环境变量就是一张表,表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
在这里插入图片描述

  1. 环境变量是系统提供的具有“全局”属性的变量

在命令行中,我们是可以定义变量的,但这些变量不是环境变量,是shell维护的,是本地变量。
在这里插入图片描述

那如何查系统中所有的变量呢?- - set命令

如何将一个本地变量变成环境变量呢? export + a(先定义变量) / export a=100(不用定义,直接导)

在这里插入图片描述
一旦一个变量被设置进环境变量表后,它就可以被其它进程访问。

  1. 子进程会继承父进程的环境变量表和命令行参数,不会继承本地变量表

在这里插入图片描述
在子进程中,可以获得父进程的环境变量,也可以取消一个环境变量
使用:unset + 环境变量名
在这里插入图片描述
既然环境变量可以被子进程继承,那它一定也就能被子进程的子进程继承。也就是说环境变量可以被bash之后所有的进程看到,这不就相当于“全局变量”吗?

在这里插入图片描述
上图中,子进程确实可以看到ISRUNNING,所以环境变量具有“全局属性”

除了使用命令行参数env,getenv(),系统中提供了一个第三方变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

54 循环神经网络RNN_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录循环神经网络使用循环神经网络的语言模型困惑度(perplexity)梯度剪裁 循环神经网络 使用循环神经网络的语言模型 输入“你”,更新隐变量,输出“好”。 困惑度(perplexity&#xff…

vue中高德地图使用 Marker 标点 - 标点数据快到 1000 时页面卡顿问题解决(已解决 - 多方面原因)+ 海量点功能实现解决

目录 1.业务需求2.最初实现及出现的问题3.解决 - 1000 个标点时页面就出现 卡顿 问题4.使用海量点、聚合标点后还有卡顿,排查其他原因5.最终解决5.1页面中list数据渲染问题解决5.2地图相关实例不要放在 vue 的可响应数据中 页面展示 1.业务需求 需要在 高德地图 中标…

LLM - 理解 多模态大语言模型(MLLM) 的 幻觉(Hallucination) 与相关技术 (七)

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/142463789 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 多模态…

使用session来实现验证码发送功能

一、什么是session? Session由服务器创建,并为每一次会话分配一个Session对象。同一个浏览器发起的多次请求,同属于一次会话(Session)。首次使用到Session时,服务器会自动创建Session,并创建Co…

【HarmonyOS】鸿蒙多Toast显示工具类

【HarmonyOS】封装可以同时显示多个toast的工具类 src/main/ets/common/MyPromptActionUtil.ets import { ComponentContent, PromptAction, window } from kit.ArkUI; import { BusinessError } from kit.BasicServicesKit;// MyPromptInfo 类用于生成唯一的 dialogID export …

SQL 性能调优

什么是 SQL 性能调优 SQL 性能调优是优化 SQL 查询以尽可能高效地运行的过程,从而减少数据库负载并提高整体系统性能。这是通过各种技术实现的,例如分析查询执行计划、优化索引和重写查询以确保最佳执行路径。目标是最大限度地减少执行查询所需的时间和…

OceanBase技术解析: 执行器中的自适应技术

在《OceanBase 数据库源码解析》这本书中,对于执行器的探讨还不够深入,它更多地聚焦于执行器的并行处理机制。因此,通过本文与大家分享OceanBase执行器中几种典型的自适应技术,作为对书中执行器部分的一个补充。 提升数据库分析性…

【开源免费】基于SpringBoot+Vue.JS技术交流分享平台(JAVA毕业设计)

博主说明:本文项目编号 T 053 ,文末自助获取源码 \color{red}{T053,文末自助获取源码} T053,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI DSI】

往期知识点记录: 鸿蒙(HarmonyOS)应用层开发(北向)知识点汇总 鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI(Display Serial Interface&#x…

Apache Iceberg 概述

Apache Iceberg概述 一、what is Apache Iceberg? 为了解决数据存储和计算引擎之间的适配的问题,Netflix开发了Iceberg,2018年11月16日进入Apache孵化器,2020 年5月19日从孵化器毕业,成为Apache的顶级项目。 Apache…

java通过webhook给飞书发送群消息

现在使用飞书的人越来越多了,飞书有一个最大的好处,可以使用webhook简便的发送群消息。而在工作中,也经常会因为一些运维方面的工作,需要给飞书发送群消息,来实时提醒相关负责人,及时处理工作。 一、先看一下效果吧&a…

OpenCV图像文件读写(5)从文件系统中读取图像的标准函数imread()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 从文件加载图像。 imread 函数从指定的文件加载图像并返回它。如果图像无法读取(因为文件缺失、权限不当、格式不受支持或无效&…

精简解析:二叉树的遍历方法及其应用场景

目录标题 二叉树的遍历方法及其应用场景摘要 1. 前序遍历 (Preorder Traversal)1.1 定义1.2 代码实现1.3 应用场景 2. 中序遍历 (Inorder Traversal)2.1 定义2.2 代码实现2.3 应用场景 3. 后序遍历 (Postorder Traversal)3.1 定义3.2 代码实现3.3 应用场景 4. 层次遍历 (Level …

Linux 文件 IO 管理(第三讲:文件系统)

Linux 文件 IO 管理(第三讲:文件系统) 进程为什么默认要打开文件描述符为 0,1 和 2 的文件呢?文件系统物理磁盘简单认识存储结构对磁盘存储进行逻辑抽象分组 —— 文件系统Block Bitmapinode Tableinode BitmapGDT(Gro…

C语言实现归并排序(Merge Sort)

目录 一、递归实现归并排序 1. 归并排序的基本步骤 2.动图演示 3.基本思路 4.代码 二、非递归实现 1.部分代码 2.代码分析 修正后代码: 归并过程打印 性能分析 复杂度分析 归并排序是一种高效的排序算法,采用分治法(Divide and Con…

【芋道源码】gitee很火的开源项目pig——后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)

后台管理快速开发框架使用笔记(微服务版之本地开发环境篇) 后台管理快速开发框架使用笔记(微服务版之本地开发环境篇) 后台管理快速开发框架使用笔记(微服务版之本地开发环境篇)前言一、如何获取项目&#…

计算机毕业设计宠物领养网站我的发布领养领养用户信息/springboot/javaWEB/J2EE/MYSQL数据库/vue前后分离小程序

目录 1.课题背景 2.课题意义 ‌ 3.技术介绍 4.技术性需求 4.1后端服务‌: 4.2 前端展示‌ 5.数据库设计‌: 6.系统性能‌: 7.安全性‌: 8. 功能介绍: 9. 部分代码 1.课题背景 近年来,随着宠物饲养数量…

2024年9月25日--- Spring-IOC 1

一 Spring的概要 1.1 简介 Spring,春天的意思,意指给软件行业带来春天。2002年,Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日,Spring框架以interface21框架为基础,经过重新设计,发…

《深度学习》—— ResNet 残差神经网络

文章目录 一、什么是ResNet?二、残差结构(Residual Structure)三、Batch Normalization(BN----批归一化) 一、什么是ResNet? ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出,斩获…

linux信号 | 学习信号三步走 | 全解析信号的产生方式

前言:本节内容是信号, 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识(没有学过的友友可以查看我的前一篇文章)。 以及我们还没有学习信号的第三个阶段——信…