Linux-环境变量

news2025/7/7 23:19:18

🚀每日鸡汤:

                        智者重因,庸者重果,顺道而行。 

目录

一、基本概念

ⅠPATH

①把我们的可执行程序拷贝到系统 /usr/bin/中

②配置环境变量

Ⅱ getenv函数

 Ⅱ user环境变量

Ⅲ PWD环境变量

二、shell变量(本地变量)和环境变量

 三、命令行参数

Ⅰargc&&argv

 Ⅱenv参数

 四、三种查看环境变量的方法

一、基本概念

🖊环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。其实,说白了环境变量就是全局设置好的变量,方便我们后续程序的执行。

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

Windows下我们是有环境变量的:

 

那么Linux下,我们的环境变量又是什么形式呢?

Linux下的常见的环境变量有:

🖊PATH: 指定命令的搜索路径

🖊HOME:指定用户的主工作目录(即用户登录到Linux系统中时默认的目录)

🖊SHELL:当前Shell,它的值通常是/bin/bash

查看环境变量的方法: echo $NAME   //NAME:你的环境变量名称

ⅠPATH

可能还是有点抽象,在Linux下我举个例子,比如我们要执行一个程序(指令),要先找到这个程序,比如./myprocess --> ./当前路径  ->找到程序。需要./可执行程序。而Linux下其实一个一个指令就是一个一个可执行程序,那么系统在执行指令的时候为什么不需要加./ 呢?这是因为系统配备了全局环境变量,它会默认去自动去查找。

那我也不想加./怎么办呢?有两种办法:

①把我们的可执行程序拷贝到系统 /usr/bin/中

/usr/bin/是系统安装指令的路径

 但是不敢这么做,因为我们写的没有经过测试,会污染系统指令词。

②配置环境变量

🖊PATH: 指定命令的搜索路径。

我们通过echo $...

可以查看环境变量PATH

 这些是什么意思呢?冒号分割的这些都是目录,这些目录就是系统配备的,系统在执行指令会默认到冒号间隔的每一个目录下去检索搜索指令,存在的话就找到执行。

系统指令能执行,是因为指令都在/usr/bin/目录下。

既然如此我们只要把我们的路径添加到这些环境里面就可以了。我们需要用到export指令。

错误使用:

这种做法会覆盖环境变量。

正确使用:

 export  PATH=$PATH 先把我们的环境变量导入, 冒号:用于 分割 要添加的路径:/home/Gyh/lesson10,此时就添加进了。

当然,我们可以查看Linux下的系统环境变量还有哪些:

 

那么在Windows下 

这些比较多,而且我们看不懂,我们来看一下系统提供的一些需要我们管着环境变量:

HISTSIZE表示我们最多能查看的历史命令条数,我们能通过history指令再来具体查看我们历史使用了哪些指令:

 env能查看当前目录下的环境变量:

Ⅱ getenv函数

我们之前了解到echo $环境变量可以在命令行查看环境变量,那么我们在程序中如果想查看环境变量是如何做到呢?这里提供了一个getenv函数来查看环境变量。

我们通过man手册来查看这个函数:

//头文件
#include<stdlib.h>

char* getenv(const char* name);

//返回值 char*
//参数:已经存在的环境变量名称

对于已经存在的环境变量,我们输入字符串名称便可以查询其内容:

 Ⅱ user环境变量

user环境变量,用于查询当前使用用户。我们可以通过getenv函数来查看这个环境变量。

 

 这里我们看到,我们在不同用户下user环境变量是不同的。也就是说user可以识别当前用户

这里我们也就知道了当我们打开一些文件为什么会提示我们权限不够,就是它配置user环境变量对当前用户身份识别。

其实,sudo的本质就是把user这个环境变量由普通用户改为root

Ⅲ PWD环境变量

PWD环境变量是查看当前路径的环境变量

这个命令非常简单,我们可以自己写一个添加到环境变量。

 

当然,别忘了删除哦! 

二、shell变量(本地变量)和环境变量

首先我们先介绍一些与本地和环境变量相关的命令,然后具体实操它们之间的联系和区别。

🖊echo  $变量名:显示某个环境/本地变量值

🖊export:设置一个新的环境变量

🖊env:显示所有环境变量

🖊unset:清除环境/本地变量

🖊set:显示本地定义的shell变量和环境变量

本地变量和环境变量有什么区别呢?我们来看以下的操作:

本地变量就是命令行定义的shell变量:

 那么我们env查看环境变量:

 

 在这里我们只查看到shell定义的变量没有export不会被添加到环境变量的。当我们添加后,我们在程序中能用getenv函数查看吗?

我们发现,我们添加后的环境变量是可以在程序中调用查看的。

如果我们没有把shell变量添加到环境变量在程序中调用函数是查看不到的。

那么说了这么多,shell本地变量 和环境变量表面上区别就是能不能被程序调用,有啥用呢?

我们知道bash是一个系统进程,这里我们创建的可执行程序myecho、addenvbash的子进程。也就是说环境变量具有全局属性能被子进程继承下去!!环境变量是设置给bash的,子进程会继承这些变量。而shell本地变量--没有添加到环境变量,没有export,只会在当前进程(bash)内有效,不能被继承

既然env不能查看环境变量,那么用什么指令来查看shell本地变量呢?

set指令

set命令可以查看本地变量,那么我想取消一个shell本地/环境变量,使用unset指令。

 

 三、命令行参数

Ⅰargc&&argv

不知道有的老铁是否知道main函数也是有参数的呢?

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

这里的argcargv参数是什么含义呢?通过类型我们知道argc是一个整数,而argv表示指针数组,我们可以把它打印出来看一下:

 我们看到当我在命令行内容不断变多时,打印的内容也在随之增加。我们可以类比ls指令。

 我们这里的命令行参数本质就是把程序名和选项依次传给argv指针数组,而argc表示程序名和选项加起来有几个,argc值就是多少,argv数组就有多大。具体系统在这里是如何操作呢?我们举个例子:

 长字符串以空格位间隔拆成一个一个子字符串argv指针数组存这些字符串,默认情况下指针数组第一个argv[0]就是输入的第一个字符串"ls"

 所以命令行参数的意义就在于命令行选项控制

 同一个命令打印出来的东西不一样,是通过它的选项控制的

这里还要提一嘴gcc编译器编译问题,有的老铁可能写for循环编译不过去

这是因为gcc编译器版本过低,需要添加c99标准

 

 Ⅱenv参数

完整的main函数参数应该有三个:

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

 这第三个参数就是环境变量

 后面就是我们的环境变量以字符串打印出来的内容,我们可以自己添加一个环境变量执行验证一下。

 四、三种查看环境变量的方法

其实这里我们正常写程序不需要写main函数的参数,那么我们想查看所有环境变量如何查看呢?

之前我们已经提到getenv函数可以查看某个已经存在的环境变量,系统还提供了一个函数environ,我们通过man手册查看一下:

我们可以看到,它是一个二级指针,对它解引用得到

 

 其实对他解引用就能得到env的每一个成员,也就是环境变量

我们可以具体写一个程序来查看一下:

 至此,这里可以总结一下程序中获取环境变量的三种方式:

🖊1、getenv()函数

🖊2、main参数 char*env[]

🖊3、extern char** environ--environ函数

其实是由四种方式,还有一种是evho $环境变量 ,这不过这是在命令行查看环境变量,这里所说的三种方式是通过程序查看环境变量的方式

推荐使用getenv()函数,可以根据环境变量名字直接拿到内容,而其余两种方式是把所有环境变量列举出来查看,有很多不需要关注的内容,没必要列举。

这里遗留一个问题:echo是一个子进程吗?如果老铁觉得是,那么为什么它可以打印本地变量呢?

 因为我们知道本地变量不能被子进程继承,而这里的ddt是一个本地变量啊。why??

echo不是子进程!!这里可以简单解释一下:

echo命令在父shell中执行,echo通过管道将内容输出到子进程中,管道可以用于父子进程之间通信,因此子进程可以拿到父进程输出的内容,这里涉及到进程间通信的内容,且听下回分解❤。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Adobe 2023全家桶已就位,拉高你的生产力,新增功能很奈斯

按照惯例。Adobe是每年一次大版本更新&#xff0c;并且是在每年的10月份中下旬&#xff0c;现在Adobe 2023终于来啦重磅更新&#xff0c;强势来袭&#xff01;​不用怀疑&#xff0c;全家桶简直是设计师福音&#xff0c;每次的大版本更新&#xff0c;为全世界的艺术设计相关人士…

Qt 样式设置

Qt 样式设置样式语法指定控件 Selector Types盒子模型 The Box Model能自定义样式的控件Sub-Controls控件的状态 Pseudo-States属性内置图标多个设置冲突层叠样式 Cascading继承规则 Inheritance子窗口不继承父窗口样式移除控件旧样式添加 .qss 文件Qt 预置颜色QLineEdit 样式设…

创建一个中国人的类

/*** 创建一个中国人的类* 分析&#xff1a;* 1、每个中国人都有一个唯一的身份证号码&#xff0c;所以身份证号码属性需要定义成实例变量* 2、每个人的姓名也都是不一样的&#xff0c;为此姓名属性也需要定义成实例变量* 3、每个中国人的国籍…

python实现目标检测voc格式标签数据增强

文章目录前言一、显示图片&#xff08;可关闭&#xff09;二、创建图像变换的类1.增强数据代码2.图像加噪声3.调整图像亮度4.添加黑色像素块5.旋转图像6.图像裁剪7.平移图像8.图像镜像9.图像随机增强选择三、增强后图片保存与xml解析保存1.从xml文件中提取bounding box信息2.保…

数据结构:循环队列

之前已经做过队列的学习笔记&#xff0c;这一篇写的是循环队列&#xff0c;大部分代码可以继续沿用&#xff0c;某些地方需要作出更改&#xff0c;使其可以实现循环队列的功能。 通俗的总结一下队列的操作&#xff0c;我的思路是将头指针固定不动&#xff0c;然后每一次元素入…

模拟实现string

第一部分&#xff1a;构造&#xff0c;析构&#xff0c;拷贝构造&#xff0c;赋值重载&#xff0c;打印函数这几个大头写出来先 string类框架 namespace xxx { class string { public: // //private: char* _str; size_t _size; size_t _capacity;const static size_t npos -…

计算机视觉——python在一张图中画多条ROC线

在验证分类算法的好坏时&#xff0c;经常需要用到AUC曲线&#xff0c;而在做不同分类模型的对比实验时&#xff0c;需要将不同模型的AUC曲线绘制到一张图里。 计算机视觉——python在一张图中绘制多个模型的对比ROC线1. 小型分类模型对比&#xff0c;可以直接调用的2. 大型的CN…

七夕,程序员教你5个表白代码,2分钟学会,牢牢主抓她的心

七夕。一个有人欢喜有人愁的节日&#xff0c;虽然对一些单身人士不太友好&#xff0c;但还有不少人都在等这个节日进行表白。毕竟这个日子的成功率会高一些。 情人节少不了送花送礼物&#xff0c;作为一个程序员&#xff0c;当然不会在送什么礼物上给你指点一二&#xff0c;但…

适合骑车时候戴的耳机怎么选,列举五款在骑行佩戴的耳机推荐

相信大多数人在运动的过程中都会感觉到枯燥无力的感觉&#xff0c;为此也一直在寻找一些能够让我们在运动中保持最初的热诚&#xff0c;在最终的选择上&#xff0c;绝大多数都是选择了耳机&#xff0c;因为耳机能够产生美妙的音乐&#xff0c;将我们运动的枯燥做进一步的抵消&a…

【附源码】Python计算机毕业设计网络教育平台设计

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【HMS Core】定位服务无法获取街道信息问题

问题描述&#xff1a; 华为HMS-定位服务无法获取省市街道信息 背景&#xff1a;在手机上集成华为定位服务的功能运行后&#xff0c;只能获取到经纬度&#xff0c;无法得到具体地址(城市/街道/建筑)。 配置环境&#xff1a;&#xff08;1&#xff09;手机型号&#xff1a;Red…

c语言实现通讯录(用三种方法来实现一个属于你的通讯录)

前沿&#xff1a; &#xff5e;&#xff5e;在一个周前&#xff0c;我用c语言实现了一个银行账号的功能&#xff0c;在总结当中我说了要实现一个通讯录&#xff0c;来实现人员的增删插改功能&#xff0c;而现在就是我实现它的时候&#xff01;&#xff01;&#xff0c;本文呢小…

基于python命令流及代码的Plaxis自动化建模

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f; 本…

SpringBoot八种bean的加载方式一学就会

目录 文章目录[toc]第一种bean的加载方式-配置文件第二种加载bean方式-注解和扫描创建第三方的bean对象第三种加载bean方式-不使用配置文件扩展-bean的加载方式扩展FactoryBean<>扩展-ImportResource导入配置文件扩展-proxyBeanMethods属性-产生代理对象第四种加载bean方…

一文读懂,python实现常用的数据编码和对称加密

相信很多使用 python 的小伙伴在工作中都遇到过&#xff0c;对数据进行相关编码或加密的需求&#xff0c;今天这篇文章主要给大家介绍对于一些常用的数据编码和数据加密的方式&#xff0c;如何使用 python 去实现。话不多说&#xff0c;接下来直接进入主题&#xff1a; 1、bas…

Windows OpenGL ES 图像灰度图

目录 一.OpenGL ES 图像灰度图 1.原始图片2.效果演示 二.OpenGL ES 图像灰度图源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Open…

Redis添加至windows服务

1.进入redis文件夹 打开redis所在文件夹&#xff0c;在资源管理器地址栏输入cmd&#xff0c;打开管理员命令提示符窗口。 2.配置服务参数 打开redis.windows.conf文件&#xff0c;找到“requirepass”配置项&#xff0c;此处设置redis密码&#xff0c;如果不需要密码&#xff0…

Python如何使用HanNLP工具

Python如何使用HanNLP工具目录系统安装配置 JDK 1.8系统安装 Visual C 2015下载 HanNLP 包测试HanNLP工具目录 目标&#xff1a;使用pycharm调用HanNLP工具完成对文本的分词、自动摘要、关键词提取等任务。 系统安装配置 JDK 1.8 1、windows环境下载 JDK 1.8 2、安装 JDK 1.…

Oracle PrimaveraUnifier空间管理器(Space Manager)

目录 前言 介绍 前言 在Oracle Primavera Unifier设施和资产管理基础产品中除了业务流程及配置管理器之外&#xff0c;其预配置设计还包含本文要介绍的空间管理器&#xff0c;即Space Manager 在Unifier中&#xff0c;空间管理器是用户可以执行设施管理任务的地方。空间管…

xv6---Lab1: Xv6 and Unix utilities

目录 参考资料&#xff1a; 1.1进程和内存 1.2 I/O 和文件描述符 1.3管道 源码&#xff1a; 调试环境搭建 sleep PingPong primes find xargs 参考资料&#xff1a; Lab: Xv6 and Unix utilities xv6-book翻译(自用&#xff09;第一章 - 知乎 1.1进程和内存 一个xv…