Linux系统 环境变量

环境变量

  • 写在前面
  • 概念
  • 查看环境变量
    • main函数的参数
      • argc & argv
      • env
  • bash环境变量

写在前面

对于环境变量,本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”,我们会更详细讲解;理解环境变量的全局属性 —— 环境变量是可以被子进程继承(注意区分 C++ 里的继承);环境变量的组织方式。其次会介绍命令行参数 —— main 函数的参数。

概念

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

我们在编写 C/C++ 代码的,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

LInux操作系统本身就是一个用C语言写的程序,操作系统可以在运行过程中开辟空间。环境变量的本质,就是在操作系统运行过程中,为自己开辟的空间,存储了一些重要的信息。

为了更好的理解环境变量的作用,现在我们先来思考一个问题,我们在执行指令的过程之中,可以直接输入指令的名字,但是我们自己写的可执行程序,一定要加上绝对路径或者相对路径才可以运行,这是为什么呢?

其实这个过程之中,环境变量的作用就显现出来了。

PATH:一个环境变量,存储着多个路径,在这些路径下面的可执行程序,可以直接执行。

PATH是我们讲解的第一个重要的环境变量,我们现在尝试观察这个环境变量。

echo $xxx:查看xxx环境变量的内容

在这里插入图片描述
可以看出这个环境变量是由多个路径组成的,每个路径由分开。
因此我们只需要把自己的可执行程序放在这里面某一个路径下面,我们自己写的可执行程序就也可以当作指令来执行了。而这个工作就是把自己写的软件安装到系统之中。

我们也可以想办法把自己的路径加到PATH环境变量中。

xxx=:修改环境变量的值

如果我们当前路径下有一个可执行程序test.exe并且我们将其路径加到了PATH中,那么我们就可以直接执行这个程序,但是原来PATH中的内容会被我们的修改直接覆盖。导致原有的ls,pwd,mkdir等等指令全部执行不了了。但是不用惊慌,我们只需要关闭xshell,然后重启,此时PATH就会恢复原先的值。

我们再来看看几个常用的的环境变量。

USER:记录当前的用户
PWD:记录当前路径
HOME:记录家目录

在这里插入图片描述

我们还可以自己定义一些环境变量:

export xxx=:定义xxx环境变量

在这里插入图片描述
不过我们自己定义的环境变量在重新启动的时候也会失效。

还有一个与环境变量相关的重要指令。

env:输出所有环境变量。

展示部分如下。
在这里插入图片描述

查看环境变量

通过之前的认识,我们知道可以通过env来查看所有的环境变量,也可以通过echo $xxx查看单个环境变量,但是这些都是在命令行中操作的,如果我们想在可执行程序中查看需要如何做呢?

  • getenv

getenv是一个函数,其定义在<stdlib.h>中。功能是:输入一个字符串作为参数,该函数输出该字符串对应的环境变量的内容。

当前test.exe程序内容如下:

#include <stdio.h>      
#include <stdlib.h>      int main()      
{      const char* path = getenv("PATH");      const char* home = getenv("HOME");      printf("PATH = %s\n", path);      printf("HOME = %s\n", home);    return 0;    
}      

在这里插入图片描述

main函数的参数

也许你或许听说过,main函数也是有参数的,但是在学习C/C++的过程中,这个参数好像可写可不写,学习环境后,我们就可以了解一下这些变量的意义是什么了。

argc & argv

main的前两参数分别是argc和argv,传参形式如下:

int main(int argc, char* argv[])  
{}

可见,argcint类型的变量,而argv是一个char*的数组。还记得我们刚刚的env指令内容吗?其实它们两个的结构是一样的。argv每个元素都是char*类型,分别指向一个字符串,argv的最后一个元素也是NULL,用于标识argv的数组结尾。而argc代表了argv中元素的个数,所以我们既可以通过NULL来判断argv结尾,也可以通过argc来判断结尾。在test中执行如下代码,来看看argv中存储了什么:

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

在这里插入图片描述
现在argv中只有一个元素,即字符串"./test.exe"

给./test.exe加几个选项试试,./test.exe -a -b -c

在这里插入图片描述
可以得出argv参数内部,存储的是调用可执行程序时,输入的选项
通过argv存储的内容我们就可以根据不同选项执行不同的内容。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>int main(int argc, char* argv[])    
{              bool flagA = false, flagB = false, flagC = false;    for(int i = 0 ; i < argc; i++)    {          if (strcmp(argv[i], "-a") == 0)    flagA = true;//说明输入了-a选项    else if (strcmp(argv[i], "-b") == 0)    flagB = true;//说明输入了-b选项    else if (strcmp(argv[i], "-c") == 0)    flagC = true;//说明输入了-c选项    }          printf("正在执行 test.exe\n");    if(flagA)    printf("功能a执行中...\n");    if(flagB)    printf("功能b执行中...\n");    if(flagC)    printf("功能c执行中...\n");    return 0;                                                                                               
}   

我们使用的绝大多数指令都是有很多选项的,我们通过输入不同的选项,让程序执行不同的功能,而程序就是通过识别argv,来判断用户输入了哪些选项,进而执行特定的功能的。

在我们向bash输入一大段指令的时候,指令本质就是一个字符串,bash会把字符串拆解为一个个小小的字符串,然后把他们整合到一个叫做命令行参数表的东西中,命令行参数表其实就是一个指针数组,而argv参数可以接收bash维护的数组,在程序内部使用。


env

main函数的第三个参数叫做env,其实它也是一个char*类型的指针数组,类型为char**

int main(int argc, char* argv[], char* env[])   
{}

这个参数和指令env的内容完全一致的。存储了所有环境变量,并且以NULL结尾。

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

bash环境变量

其实环境变量是可以继承的,可以通过下面的代码证明。

#include <stdio.h>                                                                                        
#include <unistd.h>
#include <sys/types.h>int main(int argc, char* argv[], char* env[])    
{    pid_t id = fork();    if(id == 0)//子进程    {    for(int i = 0; i < 3; i++)    {    printf("child:  env[%d]: %s\n", i, env[i]);                                                           }    }    else//父进程    {    for(int i = 0; i < 3; i++)    {    printf("father: env[%d]: %s\n", i, env[i]);    }    }    return 0;    
}  

通过fork创建了一个子进程,然后父子进程分别输出env这个数组中的前三个字符串。

输出结果:
在这里插入图片描述

可以看到父子进程都可以正常使用env,说明子进程是可以继承父进程的环境变量表的。而在所有命令行调用的进程中,都是bash的子进程,因此我们的在命令行调用的进程可以继承bash的环境变量表。只有我们登录了系统的时候,bash才会被创建,之前我们就知道,bash要维护一张环境变量表,那么bash的环境变量是怎么来的?其实这些环境变量是存储的在磁盘上的,而我们启动bash的时候,会把这些环境变量从磁盘上拷贝到内存中,组成一张环境变量表,我们访问环境变量实际上是在访问内存中的环境变量,我们修改环境变量实际上也是在修改内存中的环境变量,不会影响磁盘中的环境变量。

因此当我们重新启动Xhell时,bash都会重新从磁盘中拷贝一次环境变量,这样我们之前所做的修改或者自己添加的环境变量都会被覆盖重置

另:在家目录中,有一个叫做.bash_profile的隐藏文件 ,其内部存储的就是环境变量。这个就是我们每次重新启动从磁盘拷贝环境变量的文件内容。

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

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

相关文章

旋转变压器工作及解调原理

旋转变压器 旋转变压器是一种精密的位置、速度检测装置&#xff0c;广泛应用在伺服控制、机器人、机械工具、汽车、电力等领域。但是&#xff0c;旋转变压器在使用时并不能直接提供角度或位置信息&#xff0c;需要特殊的激励信号和解调、计算措施&#xff0c;才能将旋转变压器…

【漫话机器学习系列】076.合页损失函数(Hinge Loss)

Hinge Loss损失函数 Hinge Loss&#xff08;合页损失&#xff09;&#xff0c;也叫做合页损失函数&#xff0c;广泛用于支持向量机&#xff08;SVM&#xff09;等分类模型的训练过程中。它主要用于二分类问题&#xff0c;尤其是支持向量机中的优化目标函数。 定义与公式 对于…

基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper

KAFKA基于docker使用KRaft进行集群搭建 环境&#xff1a;已成功搭建kafka服务 可点击链接跳转至安装kafka-3.8.0版本 并启用SASL认证 教程 使用基于Zookeeper方式搭建集群教程 kafka-3.8.0版本 并启用SASL认证 教程 搭建kafka-ui可视化工具 192.168.2.91 192.168.2.92 192…

Go 语言 | 入门 | 快速入门

快速入门 1.第一份代码 先检查自己是否有正确下载 Go&#xff0c;如果没有直接去 Go 安装 进行安装。 # 检查是否有 Go $ go version go version go1.23.4 linux/amd64然后根据 Go 的入门教程 开始进行学习。 # 初始化 Go 项目 $ mkdir example && cd example # Go…

凝思60重置密码

凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式&#xff0c;在此模式下&#xff0c;用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动&#xff0c;解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…

HTML 复习

文章目录 路径问题标题标签段落标签换行标签列表标签<ol> 有序列表<ul> 无序标签标签嵌套 超链接标签多媒体标签<img> 图片标签<audio> 音频标签<video> 视频标签 表格标签<colspan> 跨行<rowspan> 跨列组合使用 表单标签基本表单标…

hot100(8)

71.10. 正则表达式匹配 - 力扣&#xff08;LeetCode&#xff09; 动态规划 题解&#xff1a;10. 正则表达式匹配题解 - 力扣&#xff08;LeetCode&#xff09; 72.5. 最长回文子串 - 力扣&#xff08;LeetCode&#xff09; 动态规划 1.dp数组及下标含义 dp[i][j] : 下标i到…

114,【6】攻防世界 web wzsc_文件上传

进入靶场 传个桌面有的 直接空白了 我们 访问一下上传的东西 /index 没显示用于解析的.htaccess和.user.ini 文件&#xff0c;还两个都不显示 但上传的时候bp查看状态码是200&#xff0c;意味着上传成功了 别的博主说这是服务器在短时间内就立刻将其删掉了&#xff0c;需…

禅道社区版项目管理软件部署(记录篇)

系统要求&#xff08;这里推荐使用docker容器化方式&#xff09;安装前的准备Docker快速安装最后通过查看地址验证是否部署成功开始界面化安装配置 禅道&#xff08;ZenTao&#xff09;是一款国产开源的项目管理软件&#xff0c;专注于敏捷开发流程&#xff0c;支持 Scrum 和 K…

B站自研的第二代视频连麦系统(上)

导读 本系列文章将从客户端、服务器以及音视频编码优化三个层面&#xff0c;介绍如何基于WebRTC构建视频连麦系统。希望通过这一系列的讲解&#xff0c;帮助开发者更全面地了解 WebRTC 的核心技术与实践应用。 背景 在文章《B站在实时音视频技术领域的探索与实践》中&#xff…

Selenium记录RPA初阶 - 基本输入元件

防止自己遗忘&#xff0c;故作此为记录。 爬取网页基本元件并修改后爬取。 包含元件&#xff1a; elements: dict[str, str] {"username": None,"password": None,"email": None,"website": None,"date": None,"ti…

Ubutun本地部署DeepSeek R1

目录 一、本地部署&终端命令行交互 二、网页端交互 三、参考链接 一、本地部署&终端命令行交互 Ollama 是一个轻量级的大语言模型管理工具&#xff0c;支持 Windows / Mac / Linux。 Ollama官网&#xff1a;Ollama # 下载安装ollama curl -fsSL https://ollama.co…

NacosRce到docker逃逸实战

NacosRce到docker逃逸实战 1、Nacos Derby Rce打入内存马 这个漏洞的原理大家应该都知道&#xff0c; 2.3.2 < Nacos < 2.4.0版本默认derby接口未授权访问&#xff0c;攻击者可利用未授权访问执行SQL语句加载构造恶意的JAR包导致出现远程代码执行漏洞。 在日常的漏洞挖…

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

[创业之路-286]:《产品开发管理-方法.流程.工具 》-1- IPD两个跨职能团队的组织

IPD&#xff08;集成产品开发&#xff09;中的两个重要跨职能组织是IPMT&#xff08;集成产品管理团队&#xff09;和PDT&#xff08;产品开发团队&#xff09;。 在IPD&#xff08;集成产品开发&#xff09;体系中&#xff0c;IRB&#xff08;投资评审委员会&#xff09;、IPM…

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之修改密码和个人资料

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f383;1.修改密码 -持久…

02.06 网络编程_概述

思维导图 总图&#xff1a;

初阶数据结构:树---堆

目录 一、树的概念 二、树的构成 &#xff08;一&#xff09;、树的基本组成成分 &#xff08;二&#xff09;、树的实现方法 三、树的特殊结构------二叉树 &#xff08;一&#xff09;、二叉树的概念 &#xff08;二&#xff09;、二叉树的性质 &#xff08;三&#…

【LeetCode】day15 142.环形链表II

142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则…