Linux环境变量

在这里插入图片描述

文章目录

  • 🥐1. 认识环境变量
    • 🥖1.1 PATH
    • 🥖1.2 HOME
    • 🥖1.3 查看环境变量
  • 🥯2. 什么是环境变量
  • 🍖3. 命令行参数
  • 🍔4. 本地变量 && 内建命令

🥐1. 认识环境变量

如果学过JAVA、Mysql的话,我们都需要在系统中配置环境变量

image-20230901123240334

那这些变量有什么用呢?

🥖1.1 PATH

我们先来做一个实验:

先写一段代码,然后生成可执行文件

image-20230901123530066

如果我们要运行这个可执行文件,前面必须要加上./mycmd才能运行,如果不加上,则会显示没有找到这个命令

image-20230901123628297

而系统的一些指令,却不用加,可以直接使用,这是因为在Linux中对于指令的搜索,系统会提供一个环境变量PATH,我们登录xshell的时候就天然存在了。

可采用指令echo $PATH查看环境变量

image-20230901123926594

这些是由一串路径,然后以:作为分隔符再跟上另一段路径,这些路径就是我们执行指令的时候,系统查找指令的路径。

image-20230901124207439

如果在这些路径下找到了,则执行这个指令,如果没找到则继续往后查找,查找完了还没找到,则显示command not found。所以我们刚刚生成的可执行文件,并不在这个路径里面。

那按这个道理来说,我们把我们的程序添加到环境变量当中去,那就不用带路径了,可以和指令一样直接使用,指令:PATH=$PATH:当前路径

image-20230901124835921

添加完成之后,我们就可以像使用指令一样,直接运行我们的程序

image-20230901124924502

添加环境变量的时候,不可以直接PATH=路径,例如PATH=/home/Pyh/linux/study/9-1

这样会直接覆盖之前的环境变量,导致系统找不到指令路径

image-20230901125132942

当然,这样不用担心,我们重新登录一下即可,因为我们所改的环境变量是内存级别的环境变量,保存在shell中,如果启动的时候shell没有这个环境变量,系统会重新加载到内存。

image-20230901125545140

🥖1.2 HOME

当我们登录xshell的时候,会默认进入到我们的家目录

image-20230901130325993

这是因为shell会识别这个账号是谁,然后填充对应的$HOME这个环节变量

🥖1.3 查看环境变量

系统中有许多环境变量,我们可以用指令env查看我们当前进程所从系统中继承的环境变量

image-20230901130956128

我们也可以提供系统调用接口getenv来获取我们环节变量

image-20230901131748378

image-20230901132005224

🥯2. 什么是环境变量

有了上面的了解,我们可以知道,环境变量是提供一组name = value形式的变量,不同的环境变量,有不同的用户,通常具有全局属性

🍖3. 命令行参数

在某些地方,可能会见过C/C++的main函数会带参数:int main(int argc,char* argv[]),这些我们在Windows开放环节基本没用过,但在Linux里面会经常用到。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[])
{int i = 0;for(;i<argc;i++){printf("argc[%d]->%s\n",i,argv[i]);}return 0;
}

生成可执行程序,然后运行,我们发现我们后面带上类似-a -b -c之后,会对应输出

image-20230901211216932

其实在bash看来,我们输入只不过是是一串字符串“./mycmd -a -b -c”,bash做命令行解释的时候,会将这个字符串以空格为分隔符打散,然后再传给main函数

image-20230901211938952

这样做是为什么呢?看下面的demo

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[])
{int i = 0;if(argc != 2){printf("Usage: %s -[a|b|c|d]\n",argv[0]);return 0;}if(strcmp(argv[1],"-a") == 0){printf("功能1\n");}else if(strcmp(argv[1],"-b") == 0){printf("功能2\n");}else if(strcmp(argv[1],"-c") == 0){printf("功能3\n");}else if(strcmp(argv[1],"-d") == 0){printf("功能4\n");}else{printf("default功能\n");}return 0;
}

生成可执行程序,然后运行

image-20230901212941090

这种操作就模拟了我们的指令操作带上不同的选项,指令本质上是同一个指令,但是根据不同的选项,可以有不同的功能

所以命令行参数,可以为指令、软件、软件等提供命令行选项的支持。

image-20230901213139055

其实main函数不止有这两个参数,还能带上环境变量参数char* env[],它也是一个指针数组,也就是说我们的C/C++代码其实有2张核心向量表命令行参数表、环境变量表

我们可以通过这个参数,遍历到我们所以的环境变量

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[],char*env[])
{int i = 0;for(;env[i];i++){printf("env[%d]->%s\n",i,env[i]);                                                  }return 0;
}

这些环境变量的显示,本质上也字符串,bash将这些分割了而已

image-20230901214154211

我们这个程序运行之后,是bash的子进程,这些环境变量都是bash在启动的时候从操作系统的配置文件里面读取的,而它的子进程,可以继承它的环境变量。

所以这就能证明上面所说的环境变量具有全局性!

当然了,我们也可以验证一下,我们添加自己的环境变量到bash当中:

export MY_ENV=11223344

image-20230901215127035

这个操作过程中,没有对程序进行任何修改,然后重新运行刚才的程序

image-20230901215231259

验证完毕之后,把这个环境变量给去掉,采用指令unset MY_ENV

image-20230901215346041

Tips:

如果main函数不添加参数,可采用C语言提供的接口extern char** environ获取

image-20230901222642534

image-20230901222935852

🍔4. 本地变量 && 内建命令

除了有环境变量,还有本地变量,我们直接在命令行中输入

image-20230901215844635

我们也可以采用set命令查看本地变量和环境变量

image-20230901220333516

这些本地变量只在本bash内部有效,不会被继承,这个也是可以进行验证

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[],char*env[])
{printf("MY_ENV: %s\n",getenv("MY_ENV"));return 0;
}

然后我们添加一个名为MY_ENV的本地变量

image-20230901220910793

验证发现并没有继承下来,然后可以将本地变量导成环境变量export MY_ENV

image-20230901221037820

那这里还有一个疑问,那就是既然说这些指令都是属于bash的子进程,那么这个程序也是bash的子进程,那为什么我们写的这个程序用getenv()获取不到本地变量,而echo这个子进程却可以拿到本地变量呢?

这其实是因为,命令行上所启动的指令,不一定要创建子进程,我们可将命令分为两类:

  1. 常规命令:通过创建子进程完成

  2. 内建命令:不创建子进程,由自己亲自执行,类似于bash调用自己写的函数或系统提供的函数(cdecho命令)

    模拟cd命令:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    int main(int argc,char*argv[],char*env[])
    {sleep(10);printf("begin:\n");if(argc == 2){chdir(argv[1]);}printf("end\n");sleep(10);return 0;
    }
    

    cd


那本次分享就到这里了,我们下期再见,如果还有下期的话。

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

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

相关文章

MySQL binlog的几种日志录入格式以及区别

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌&#xff0c;CSDN博客专家&#xff0c;阿里云社区专家博主&#xff0c;2023年6月CSDN上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师…

进程的挂起状态

进程的挂起状态详解 当我们谈论操作系统和进程管理时&#xff0c;我们经常听到进程的各种状态&#xff0c;如“就绪”、“运行”和“阻塞”。但其中一个不那么常被提及&#xff0c;但同样重要的状态是“挂起”状态。本文将深入探讨挂起状态&#xff0c;以及为什么和在何时进程…

layui框架学习(42:文件上传模块-上)

之前学习asp.net core编程入门教程时结合layui测试过文件上传《基于ASP.Net Core和Layui的多文件上传》&#xff0c;但没有认真学习过layui的文件上传模块&#xff0c;本文开始&#xff0c;计划分两章学习并记录文件上传模块中的属性、事件及函数的使用方法。   layui中的文件…

el-date-picker限制选择的时间范围

<el-date-pickersize"mini"v-model"dateTime"value-format"yyyy-MM-dd HH:mm:ss"type"datetimerange"range-separator"~"start-placeholder"开始日期"end-placeholder"结束日期":picker-options&quo…

mfc140u.dll丢失如何修复?解析mfc140u.dll是什么文件跟修复方法分享

大家好&#xff01;今天&#xff0c;我将和大家分享一下关于计算机中mfc140u.dll丢失的6种解决方法。希望我的分享能对大家在计算机使用过程中遇到问题时提供一些帮助。 首先&#xff0c;我想请大家了解一下什么是mfc140u.dll文件。mfc140u.dll是一个动态链接库文件&#xff0…

C++中基类和派生类的析构函数

和构造函数类似&#xff0c;析构函数也不能被继承。与构造函数不同的是&#xff0c;在派生类的析构函数中不用显式地调用基类的析构函数&#xff0c;因为每个类只有一个析构函数&#xff0c;编译器知道如何选择&#xff0c;无需程序员干涉。 另外析构函数的执行顺序和构造函数的…

Docker consul容器服务自动发现和更新

目录 一、什么是服务注册与发现 二、Docker-consul集群 1.Docker-consul 2.registrator 3.Consul-template 三、Docker-consul实现过程 四、Docker-consul集群配置 1.下载consul服务 2.web服务器启动多例nginx容器&#xff0c;使用registrator自动发现 3.使用…

opencv案例06-基于opencv图像匹配的消防通道障碍物检测与深度yolo检测的对比

基于图像匹配的消防通道障碍物检测 技术背景 消防通道是指在各种险情发生时&#xff0c;用于消防人员实施营救和被困人员疏散的通道。消防法规定任何单位和个人不得占用、堵塞、封闭消防通道。事实上&#xff0c;由于消防通道通常缺乏管理&#xff0c;导致各种垃圾&#xff0…

linux上vscode中.cpp文件中引入头文件.hpp时报错:找不到头文件(启用错误钵形曲线)

当在.cpp文件中引入系统给定的头文件时&#xff1a;#include < iostream > 或者引入自定义的头文件 &#xff1a;#include <success.hpp> 报错&#xff1a;找不到相应的头文件&#xff0c;即在引入头文件的改行底下标出红波浪线 解决方法为&#xff1a; &#…

【LeetCode算法系列题解】第11~15题

CONTENTS LeetCode 11. 盛最多水的容器&#xff08;中等&#xff09;LeetCode 12. 整数转罗马数字&#xff08;中等&#xff09;LeetCode 13. 罗马数字转整数&#xff08;简单&#xff09;LeetCode 14. 最长公共前缀&#xff08;简单&#xff09;LeetCode 15. 三数之和&#xf…

渗透测试漏洞原理之---【XSS 跨站脚本攻击】

文章目录 1、跨站 脚本攻击1.1、漏洞描述1.2、漏洞原理1.3、漏洞危害1.4、漏洞验证1.5、漏洞分类1.5.1、反射性XSS1.5.2、存储型XSS1.5.3、DOM型XSS 2、XSS攻防2.1、XSS构造2.1.1、利用<>2.1.2、JavaScript伪协议2.1.3、时间响应 2.2、XSS变形方式2.2.1、大小写转换2.2.2…

【c语言】结构体内存对齐,位段,枚举,联合

之前学完结构体&#xff0c;有没有对结构体的大小会很疑惑呢&#xff1f;&#xff1f;其实结构体在内存中存储时会存在内存对齐&#xff0c;捎带讲讲位段&#xff0c;枚举&#xff0c;和联合&#xff0c;跟着小张一起学习吧 结构体内存对齐 结构体的对齐规则: 第一个成员在与结…

计算机视觉-LeNet

目录 LeNet LeNet在手写数字识别上的应用 LeNet在眼疾识别数据集iChallenge-PM上的应用 LeNet LeNet是最早的卷积神经网络之一。1998年&#xff0c;Yann LeCun第一次将LeNet卷积神经网络应用到图像分类上&#xff0c;在手写数字识别任务中取得了巨大成功。LeNet通过连续使用…

Dubbo 应用切换 ZooKeeper 注册中心实例,流量无损迁移

首先思考一个问题&#xff1a;如果 Dubbo 应用使用 ZooKeeper 作为注册中心&#xff0c;现在需要切换到新的 ZooKeeper 实例&#xff0c;如何做到流量无损&#xff1f; 本文提供解决这个问题的一种方案。 场景 有两个基于 Dubbo 的微服务应用&#xff0c;一个是服务提供者&…

CXL 内存交织(Memory Interleaving)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

Java 读取TIFF JPEG GIF PNG PDF

Java 读取TIFF JPEG GIF PNG PDF 本文解决方法基于开源 tesseract 下载适合自己系统版本的tesseract &#xff0c;官网链接&#xff1a;https://digi.bib.uni-mannheim.de/tesseract/ 2. 下载之后安装&#xff0c;安装的时候选择选择语言包&#xff0c;我选择了中文和英文 3.…

恒运资本:股票跌100%后怎么办?

在股票市场里&#xff0c;股票价格跌涨是日常的现象&#xff0c;有时候涨到令人惊喜&#xff0c;有时候却一路跌向谷底。股价跌到零的情况并不常见&#xff0c;可是&#xff0c;假如是跌了100%怎么办呢&#xff1f; 在探究该问题前&#xff0c;咱们需要了解股票跌100%是怎样的…

微服务之Nacos

1 版本说明 官网地址&#xff1a; https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 1.1 2021.x 分支 适配 SpringBoot 2.4, Spring Cloud 2021.x 版本及以上的Spring Cloud Alibaba 版本如下表&#xff08;最新版本用*标记&am…

腾讯音乐如何基于大模型 + OLAP 构建智能数据服务平台

本文导读&#xff1a; 当前&#xff0c;大语言模型的应用正在全球范围内引发新一轮的技术革命与商业浪潮。腾讯音乐作为中国领先在线音乐娱乐平台&#xff0c;利用庞大用户群与多元场景的优势&#xff0c;持续探索大模型赛道的多元应用。本文将详细介绍腾讯音乐如何基于 Apach…

LeetCode-455-分发饼干-贪心算法

题目描述&#xff1a; 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[i]&#xff0c;这是能让孩子们满足胃口的饼干的最小尺寸&#xff1b;并且每块饼干 j&#xff…