Linux之环境变量(超详细版)

前言:各位老铁们好,好久没分享知识了,今天我要和各位老铁分享的是环境变量 ,对于Linux操作系统的学习者,我们会经常使用到环境变量,那么什么是环境变量呢?在讲环境变量之前,先问各位老铁一个问题,为什么我们编译好我们写的程序,然后在执行二进制可执行文件时,需要链接动静态库时。我们都不知道动静态库在哪,但是我们./目标文件名时就会自动链接动静态库了呢?当我们运行我们的程序时,操作系统会自动去相应的路径下去查找动静态库,那明明我们在代码中根本没有写任何的关于路径的代码,那么OS为什么能够找到动静态库呢?我们在安装对于的库时,OS会把安装路径写在配置文件中,再通过环境变量去对应的配置文件去查找到对应的动静态库的路径。

1.环境变量的定义:

环境变量简单来说就是一个工作指南,只有当你拿到这个工作指南时,你才可以知道你在哪里找到工作的文件,工作的流程和需要使用那些工具来进行工作。环境变量相当于一个全局变量

2.常见的环境变量:

我们先来见见系统中所有的环境变量:

[ljy@localhost ~]$ env

在这里插入图片描述
我们可以看到在系统中有很多的环境变量,那么那些是我们常用的呢?

(1)PATH:指令的默认搜索路径

我们在Linux中执行二进制文件时,需要./目标文件名,为什么需要指明在当前路径下呢?为什么输入echo指令时不需要指明路径在哪呢?
原因是OS会把一些指令的搜素路径放到/usr/bin目录下,当你输入指令时,OS会去/usr/bin目录下查找对应的路径,而环境变量PATH就是指向指令默认的搜素路径的。
我们来看看是不是
在这里插入图片描述
现在我们写个程序来验证一下PATH的功能吧

#include <iostream>
using namespace std;int main()
{cout<<"hello Linux"<<endl;return 0;
}

在这里插入图片描述

现在我在dd目录下写了一个test.cpp文件,我现在不想像以前一样带路径才能执行该文件,我想像系统指令一样,输入指令就能执行该文件了。
我们只需要使用PATH环境变量就可以实现了,需要把我们写的程序的路径放到PATH环境变量中,系统就会自动去PATH环境变量中查找我们代码的路径。
我们来验证一下吧

//export用于设置一个新的环境变量
[ljy@localhost dd]$ export PATH=$PATH:/home/ljy/dd

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
那么test1就成功添加到指令的默认路径中了。

(2)HOME:linux登陆时,指定的用户的工作目录

我们来验证一下看看
在这里插入图片描述
在这里插入图片描述

(3)SHELL:表示当前的shell

在这里插入图片描述

(4)USER:表示当前使用的linux的用户

在这里插入图片描述

(5)PWD:表示当前的路径

我们使用ls指令查看文件时,是如何知道该文件在那个路径下,有的老铁可能会说,这还用说吗,不就是在当前路径下吗?那操作系统又是怎么知道在当前路径下的呢?
OS是借助PWD环境变量来知道当前是处于那个路径下,再在该路径下使用ls进行列出文件,使用ls指令时,该进程会创建出子进程,子进程会继承父进程的环境变量(环境变量是全局的),再通过环境变量PWD去查找当前所在的路径,最后列出当前路径下的文件
在这里插入图片描述

3.查看环境变量的方法

(1)

echo $环境变量名

在这里插入图片描述

(2)查看系统中所有的环境变量

env

在这里插入图片描述

(3)将本地变量变为环境变量

export 变量名

注意:本地变量只在当前shell会话中有效,而环境变量在任何shell都有效
在这里插入图片描述

(4)显示本地变量和环境变量

set

在这里插入图片描述

(5)取消变量

unset

在这里插入图片描述

4.命令行参数

不知道各位老铁有没有看到过带参数的main函数

int main(int argc,char* agrv[])
{return 0;
}

应该绝大多数老铁都看到过main这种写法,不知道各位老铁会不会好奇,char* agrv[]里面存放着什么,char* agrv[]是一个字符指针数组,我们来看看里面存放着什么吧

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

我们来运行一下上面的代码
在这里插入图片描述
在这里插入图片描述

通过上面的代码输出结果和图示,我们可以很清楚argv数组中存储的是什么了,在argv数组中,argv[0]存储的是程序的路径和名称,后面存储的是该程序所带的参数,那么是谁传命令行参数给main函数的呢?当前是父进程传的命令行参数给main函数的啦

在上面我们看到了main函数中传两个参数的情况,但是main函数最多是可以传三个参数的,那main函数中的第三个参数是什么呢?
下面我写段代码给大家解释一下

#include <stdio.h>int main(int argc,char* argv[],char* env[])
{return 0;
}

相信各位老铁会非常好奇env数组中存放的是什么,在这里就不卖关子了,其实env数组中存放的是环境变量
在这里插入图片描述
到这里有老铁可能就会反驳说,凭啥你说是存放环境变量啊,我认为不是环境变量啊,而是存放其他的啊,那么就由我来为大家验证一下吧。
这里我就写个make文件直接进行编译了(比较懒hhh)
在这里插入图片描述

#include <stdio.h>int main(int argc,char* argv[],char* env[])
{//注意:env数组在main函数中是没有传入个数的,//      但是env数组也是以NULL结尾的,NULL又可以看成0for(int i=0;env[i];i++){printf("env[%d]: %s",i,env[i]);}return 0;
}

我们来编译运行一下代码看看结果
在这里插入图片描述
通过上面我们可以证明系统会加与父进程相关的所有环境变量到main函数中的env数组中,子进程会继承来自于父进程的环境变量

5.获取环境变量

1.在上面我们知道了一种获取环境变量的方法,就是通过main函数参数进行获取环境变量,但现在,我不想通过main函数参数来获取环境变量了,那么还有其他的方法吗?那必须有啊!

2.getenv(推荐使用)

我们来看看getenv函数的文档
在这里插入图片描述
在这里插入图片描述
getenv是用于获取环境变量的,当getenv获取成功是返回指向环境变量的指针,获取失败返回NULL

话不多说,直接展示

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n",getenv("PATH"));return 0;
}

在这里插入图片描述

2.environ(C语言提供的)

老规矩,先看看该函数的文档
在这里插入图片描述
在这里插入图片描述
直接演示environ的使用方法

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{//注意:environ是一个二级指针//environ[1]表示指向env数组的第一个元素,再进行解引用for(int i=0;environ[i];i++){printf("environ[%d]:%s\n",i,environ[i]);}return 0;
}

在这里插入图片描述
报错没声明,那么我们直接加个类型声明呗

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{extern char** environ;//注意:environ是一个二级指针//environ[1]表示指向env数组的第一个元素,再进行解引用for(int i=0;environ[i];i++){printf("environ[%d]:%s\n",i,environ[i]);}return 0;
}

在这里插入图片描述

总结:

以上内容分享了关于Linux中的环境变量的定义,常用的环境变量,查看环境变量的方法,获取环境变量的方式。希望各位老铁看完能有所收获。

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

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

相关文章

【C语言】联合体 `union` 的妙用

C 语言联合体的妙用:结合 . 和 -> 操作符与 typedef 的深入剖析 在 C 语言中,联合体(union)是一种独特的复合数据类型,因其内存共享特性而在内存优化、类型切换和底层操作中展现出妙用。与结构体(struct)不同,联合体允许同一块内存存储不同类型的数据,提供高效且灵…

macOS - 使用 tmux

文章目录 安装 tmux使用更多快捷键说明 安装 tmux brew install tmux使用 在终端输入 tmux 进入 tmux 界面&#xff0c;然后 输入 Control Option B 进入交互模式 输入 % 左右分栏&#xff0c;" 上下分割 上一个窗格&#xff1a;{&#xff0c;下一个&#xff1a;} PS…

构建私有化AI知识库:基于CentOS的Ollama + DeepSeek-R1 +ragflow 整合部署教程

操作系统&#xff1a;CentOS 7.9 CPU&#xff1a;支持 AVX 指令集的 x86_64 处理器 内存&#xff1a;64GB 存储&#xff1a;SSD 1TB 以上 GPU&#xff08;可选&#xff09; 一、组件介绍 Ollama Ollama 是一个专为在本地机器上部署和运行大型语言模型&#xff08;LLM&a…

Goby 漏洞安全通告| Ollama /api/tags 未授权访问漏洞(CNVD-2025-04094)

漏洞名称&#xff1a;Ollama /api/tags 未授权访问漏洞&#xff08;CNVD-2025-04094&#xff09; English Name&#xff1a;Ollama /api/tags Unauthorized Access Vulnerability (CNVD-2025-04094) CVSS core: 6.5 风险等级&#xff1a; 中风险 漏洞描述&#xff1a; O…

Linux命令超级汇总

文件和目录操作 命令语法常用选项及说明lsls [选项] [目录名]- -l&#xff1a;以长格式显示文件和目录信息 - -a&#xff1a;显示所有文件&#xff0c;包括隐藏文件 - -h&#xff1a;与 -l 配合&#xff0c;以人类可读的方式显示文件大小 - -R&#xff1a;递归显示子目录内容cd…

Python 爬取唐诗宋词三百首

你可以使用 requests 和 BeautifulSoup 来爬取《唐诗三百首》和《宋词三百首》的数据。以下是一个基本的 Python 爬虫示例&#xff0c;它从 中华诗词网 或类似的网站获取数据并保存为 JSON 文件。 import requests from bs4 import BeautifulSoup import json import time# 爬取…

14. LangChain项目实战1——基于公司制度RAG回答机器人

教学视频&#xff1a; 12. 基于Gradio搭建基于公司制度RAG_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV11VXRYTErZ/ 环境配置&#xff1a; python版本&#xff1a;3.10.8 服务器&#xff1a;Ubuntu 依赖包requirements.txt文件内容&#xff1a; aiofiles23.2.1 …

香港首个人工智能大模型HKGAI V1发布:粤语AI时代正式开启

2月25日&#xff0c;香港科技创新领域迎来了一项里程碑式的成就——由香港特区政府重点创科项目“InnoHK 创新香港研发平台”慷慨资助的香港生成式人工智能研发中心(HKGAI)正式揭晓了其倾力打造的HKGAI V1大模型。这一创举不仅标志着香港在人工智能发展道路上迈出了坚实的一步&…

简易的微信聊天网页版【项目测试报告】

文章目录 一、项目背景二、项目简介登录功能好友列表页面好友会话页面 三、测试工具和环境四、测试计划测试用例部分人工手动测试截图web自动化测试测试用例代码框架配置内容代码文件&#xff08;Utils.py&#xff09;登录页面代码文件&#xff08;WeChatLogin.py&#xff09;好…

QT播放视频保持视频宽高比消除黑边

QT播放视频保持视频宽高比消除黑边 1、问题 在播放视频的时候&#xff0c;由于框架的大小发生变化&#xff0c;导致视频出现黑边很不好看。 因此需要像一种方法消除黑边 2、处理 1、读取视频的宽高比 2、设置视频的Widget的大小固定&#xff0c;Widget的宽高比和视频宽高比…

Apache nifi demo 实验

Apache nifi 是个数据流系统&#xff0c;可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程&#xff0c;读取数据库里的数据&#xff0c;再转换&#xff0c;最后保存到本地文件。 这样可以来实现一些数据转换的操作&#xff0c;而不用特地编写程序来导入导出。…

蓝桥杯 - 每日打卡(类斐波那契循环数)

题目: 解题思路&#xff1a; 假设输入数值为number 分析题目&#xff0c;如果想要解决这个问题&#xff0c;我们需要实现两个方法&#xff0c;第一个检查number是否是类斐波那契&#xff0c;第二个是模拟1e7 - 0的过程&#xff0c;因为是求最大的&#xff0c;那么我们从1e7开始…

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

RAG组件:向量数据库(Milvus)

在当前大模型盛行的时代&#xff0c;大模型的垂类微调、优化成为产业落地、行业应用的关键&#xff1b;RAG技术应运而生&#xff0c;主要解决大模型对专业知识、实效性知识欠缺的问题&#xff1b; RAG的核心工作逻辑是将专业知识、实效知识等大模型欠缺的知识进行收集、打包、保…

2022java面试总结,1000道(集合+JVM+并发编程+Spring+Mybatis)的Java高频面试题

1、面试题模块汇总 面试题包括以下十九个模块&#xff1a; Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql、Redis、JVM 。如下图所示…

英码科技携昇腾DeepSeek大模型一体机亮相第三届北京人工智能产业创新发展大会

2025年2月28日&#xff0c;第三届北京人工智能产业创新发展大会在国家会议中心隆重开幕。本届大会以"好用、易用、愿用——以突破性创新加速AI赋能千行百业”为主题&#xff0c;重点展示人工智能技术创新成果与产业化应用实践。作为昇腾生态的APN伙伴&#xff0c;英码科技…

(链表 删除链表的倒数第N个结点)leetcode 19

设空结点指向head便于插入和删除结点 考虑特殊情况 head结点被删除 a结点仅用来测试长度&#xff0c;找到目标结点的位置 b结点为空结点指向head返回值 cur用来删除目标值&#xff08;特殊情况 目标值为head 这时curb) 则开始就将cur初始化为b开始遍历 /*** Definition fo…

Android Studio 新版本Gradle发布本地Maven仓库示例

发布代码到JitPack示例&#xff1a;https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2&#xff08;Gradle 8.10.2 AGP 8.8.0 JDK17&#xff09; 的本地 Maven 仓库发布示例&#xff0c;包含aar和jar的不同配置&#xff1a; 1.…

[今年毕业设计]最新最全最有创意的基于云计算的计算机专业毕设选题精选推荐汇总建议收藏!!

文章目录 前言基于云计算的毕业设计选题毕设作品展示 前言 2025全新毕业设计项目 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云等平台优质作者。 &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅&#x1f4…

coze生成的工作流,发布后,利用cmd命令行执行。可以定时发日报,周报等。让他总结你飞书里面的表格。都可以

coze生成的工作流&#xff0c;发布后&#xff0c;利用cmd命令行执行。可以定时发日报&#xff0c;周报等。让他总结你飞书里面的表格。都可以。 很简单。 准备工作&#xff0c;先发布你的工作流&#xff0c;和发布应用。 然后&#xff0c;点击扣子API 。 申请一个&#xff0…