【Linux】:环境变量

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux环境变量的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 环境变量  

1.1 基本概念

1.2 常见的环境变量

1.2.1 PATH 

1.2.2 PWD

1.2.3 HOME

1.2.4 查看全部环境变量

2. 获取环境变量

2.1 getenv接口

2.2 mian函数的第三个参数 

2.3 定义并导出环境变量

2.3.1 内存级别

2.3.2 更改环境变量脚本配置文件 

2.4 通过第三方变量environ获取 

3. 本地变量和环境变量

4. 与环境变量相关的指令


1. 环境变量  

一个可执行程序要能运行起来或者是一个指令要能跑起来,首先得找到这个可执行程序,我们在启动我们的可执行程序的时候,前面都要加上一个 ./ 在当前路径下查找这个可执行程序,我们在命令行中输入的指令它本质上也是可执行程序,那么为什么它不需要查找呢?

我们使用的指令也是经过查找的,只不过不需要我们自己手动查找,会存在默认的搜索路径,这些路径参数就是OS内部的环境变量。

1.1 基本概念

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

1.2 常见的环境变量

查看环境变量的指令:echo $NAME  //NAME:环境变量名称

1.2.1 PATH 

PATH : 指定命令的搜索路径

首先就是我们指令的默认搜索路径的环境变量:使用 echo $PATH 指令查看

  • 以 为分割符,分割的这些字串就是一个个的搜索路径;
  • 在执行我们的普通指令的时就会默认在这些路径下按照顺序搜索;

那么我们能否将我们的可执行程序的路径也添加进去呢? 

答案是可以的,只需要使用PATH=$PATH:路径(中间不能有空格)

同样的,将我们的可执行程序直接拷贝到这些搜索路径中,也是可以直接执行的,这种方法就叫做程序安装。

默认更改的环境变量是内存级别的(只限于本次登录)重新登录之后就会恢复默认。  

1.2.2 PWD

PWD:记录当前位于哪个目录下

在命令行中我们使用的pwd命令他是怎么知道我们当前位于哪个路径下的?

肯定是在这个指令中封装了查看PWD环境变量的一些调用,然后将该结果返回给我们。

1.2.3 HOME

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

在Linux中分为普通用户和超级用户,那么当普通用户刚刚登录进去时它所处的路径在/home/XXX下,超级用户在登录进去时在/root下,那么为什么两个用户的所在路径不一样呢?又是怎么做到的呢?

使用echo $HOME 查看该环境变量:

该环境变量刚好记录的就是普通用户和超级用户的主工作目录。

所以在我们登录的时候:

1. 输入用户名和密码

2. 认证

3. 形成环境变量(PATH、PWD、HOME......)

        3.1 根据用户名来初始化HOME=/root ro HOME=/home/XXX 

4. cd $HOME

1.2.4 查看全部环境变量

env指令:查看所有的环境变量

在系统中会存在大量的环境变量,每一个环境变量都有都有它特殊的用途,用来完成指定的系统功能!

2. 获取环境变量

获取环境变量一共有三种方法,接下来就一次介绍:

2.1 getenv接口

系统调用接口:getenv

传递所要获取的环境变量的名称,它的返回值就是环境变量的内容。

我们可以使用系统调用配合环境变量来指定的执行一些代码:比如只能让超级用户具有执行代码的权利:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>int main()
{char* name = getenv("USER");if(strcmp(name, "root") != 0){printf("这是一个非法用户:%s\n", name);return 1;}printf("myself command!\n");printf("myself command!\n");printf("myself command!\n");printf("myself command!\n");return 0;
}

 

2.2 mian函数的第三个参数 

在上一章节的命令行参数中,说到main函数可以带两个参数,第一个参数是命令行输入的选项个数,第二个参数是该选项被分割的字串,那么在本章节,就要介绍main函数的第三个参数:

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

该参数是一个字符指针数组,里面保存的是字符串的地址。

当我们在命令行中使用env指令时会给我们打印出来所有的环境变量信息,那么这个信息是从哪里来的呢?

在Linux登录时会创建一张环境变量表,这张表的名字就叫做char *env[],这张表中每个下标位置都对应的是一个kv结构的环境变量,最终以NULL结尾。

系统启动时,可以给我们的进程(mian)提供两张表:

1. 命令行参数表

2. 环境变量表

可以使用main函数的第三个参数来查看环境变量

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

 并且打印出来的环境变量信息和命令行使用env指令的信息一样。

我们在命令行中./启动的进程都是shell/bash的子进程,所以子进程的命令行参数和环境变量是父进程传递的!

那么父进程的环境变量信息又从哪里来?

当我们更改环境变量时,不小心改错了,那么没关系,只需要重新登录就可以恢复原来的环境变量,所以说我们更改环境变量信息默认更改的是bash进程内部的环境变量信息!每一次重新登录都会形成新的bash解释器,并且新的bash解释器会从指定位置中读取自己的环境变量表信息! 

环境变量信息是以脚本配置文件的形式存在的,这个配置文件在家目录下的.bash_profile文件:

所以在每一次登录的时候,bash都回读取.bash_profile配置文件中的内容为bash形成一张环境变量表信息,那么bash拿到了环境变量信息,就可以将环境变量信息传递给它的所有子进程。 

2.3 定义并导出环境变量

2.3.1 内存级别

在我们的命令行中可以直接定义一个环境变量:

MYENV_TEST1=helloLinux

MYENV_TEST2=helloWorld

然后使用export命令导出环境变量:

export MYENV_TEST1

export MYENV_TEST2

也可以直接定义+导出:

export MYENV_TEST1=helloLinux

export MYENV_TEST2=helloWorld

这样的配置是内存级别的,重新登录就不见了。

2.3.2 更改环境变量脚本配置文件 

直接在.bash_profile配置文件中添加环境变量

这样就做到了每次登录就会自动读取配置文件中的环境变量信息。

如果我们导出了一个环境变量, 那么这个环境变量信息可以被它的子进程全部读到的,所以我们说系统环境变量具有全局属性!

2.4 通过第三方变量environ获取 

#include <stdio.h>
int main()
{extern char **environ;  //第三方变量int i = 0;for (; environ[i]; i++){printf("%s\n", environ[i]);}return 0;
}

3. 本地变量和环境变量

在Linux的命令行中,我们可以直接定义本地变量:

可以看到定义本地变量时跟定义环境变量一样,只不过定义环境变量时需要使用export进行导出。

那么本地变量和环境变量有什么区别呢?

本地变量只在bash进程内部有效,不会被子进程继承下去。

环境变量通过让所有的子进程继承的方式,实现自身的全局性。 

我们都知道,在命令行中执行的命令也是一个子进程呀,那为什使用echo指令时还能看到bash定义的本地变量呢?

Linux中的指令分为两类:

1. 常规命令:shell通过fork之后让子进程执行的命令。

2. 内建命令:shell命令行的一个函数,使用时相当于函数调用。

echo命令就属于内建命令,所以可以看到bash定义的本地变量。 

4. 与环境变量相关的指令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量
5. set: 显示本地定义的shell变量和环境变量

 

 

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

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

相关文章

mac|浏览器链接不上服务器但可以登微信

千万千万千万不要没有关梯子直接关机&#xff0c;不然就会这样子呜呜呜 设置-网络&#xff0c;点击三个点--选择--位置--编辑位置&#xff08;默认是自动&#xff09; 新增一个&#xff0c;然后选中点击完成 这样就可以正常上网了

【嵌入式DIY实例】- LCD ST7735显示DHT11传感器数据

LCD ST7735显示DHT11传感器数据 文章目录 LCD ST7735显示DHT11传感器数据1、硬件准备与接线2、代码实现本文介绍如何将 ESP8266 NodeMCU 板 (ESP-12E) 与 DHT11 (RHT01) 数字湿度和温度传感器连接。 NodeMCU 从 DHT11 传感器读取温度(以 C 为单位)和湿度(以 rH% 为单位)值,…

计算机网络-第5章运输层

5.1运输层协议概述 5.1.1进程之间的通信 运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 通信的两端应当是两个主机中的应用进程。 运输层复用和分用&#xff1a;复用指在发送方不同的应用进程都可以…

【机器学习】FFmpeg+Whisper:二阶段法视频理解(video-to-text)大模型实战

目录 一、引言 二、FFmpeg工具介绍 2.1 什么是FFmpeg 2.2 FFmpeg核心原理 2.3 FFmpeg使用示例 三、FFmpegWhisper二阶段法视频理解实战 3.1 FFmpeg安装 3.2 Whisper模型下载 3.3 FFmpeg抽取视频的音频 3.3.1 方案一&#xff1a;命令行方式使用ffmpeg 3.3.2 方案二&a…

基于协同过滤的电影推荐与大数据分析的可视化系统

基于协同过滤的电影推荐与大数据分析的可视化系统 在大数据时代&#xff0c;数据分析和可视化是从大量数据中提取有价值信息的关键步骤。本文将介绍如何使用Python进行数据爬取&#xff0c;Hive进行数据分析&#xff0c;ECharts进行数据可视化&#xff0c;以及基于协同过滤算法…

SuperMap GIS基础产品FAQ集锦(20240701)

一、SuperMap iDesktopX 问题1&#xff1a;对于数据提供方提供的osgb格式的数据&#xff0c;如何只让他生成一个s3mb文件呢&#xff1f;我用倾斜入库的方式会生成好多个s3mb缓存文件 11.1.1 【解决办法】不能控制入库后只生成一个s3mb文件&#xff1b;可以在倾斜入库的时候设…

2024第17届中国西部(重庆)留学移民海外置业展览会

2024第17届中国西部&#xff08;重庆&#xff09;留学移民海外置业展览会 邀请函 主办单位&#xff1a; 中国西部教体医融合博览会组委会 承办单位&#xff1a;重庆中博展览有限公司 展会背景&#xff1a; 成都和重庆是中国新一线城市&#xff0c;是西部经济的核心增长极&a…

代码随想录算法训练营第59天:动态[1]

代码随想录算法训练营第59天&#xff1a;动态 两个字符串的删除操作 力扣题目链接(opens new window) 给定两个单词 word1 和 word2&#xff0c;找到使得 word1 和 word2 相同所需的最小步数&#xff0c;每步可以删除任意一个字符串中的一个字符。 示例&#xff1a; 输入: …

实施粘贴式导航_滚动事件

● 所谓的粘贴式导航&#xff0c;就是当我们滑动页面到某一个位置的时候&#xff0c;导航不会因为滑动而消失&#xff0c;会固定在页面的顶部&#xff0c;我们来看一下如何实现&#xff1b; ● 首先我们要获取我们想要滚动到哪一部分的时候让导航栏显示出来&#xff0c;这就需要…

Java案例抢红包

目录 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#xff08;遇见问题先想出完整的思路逻辑再去动手事半功倍&#xff09; 三&#xff1a;具体代码&#xff1a; 一&#xff1a;题目要求&#xff1a; 二&#xff1a;思路分析&#xff1a;&#x…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了&#xff0c;这里不在熬述&#xff0c;它在LLM分析中&#xff0c;尤其是在语义相似度的计算中至关重要&#xff0c;在dot attention机制中&#xff0c;也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

JS(JavaScript)的BOM操作

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

一文汇总VSCode多光标用法

光标的创建 按住alt&#xff0c;鼠标左键单击&#xff0c;在单击位置生成光标/删除光标 按住ctrlalt&#xff0c;单击↑/↓&#xff0c;在每行同一个位置&#xff08;若某一行较短&#xff0c;则在行尾&#xff09;生成光标&#xff0c;这个不会删除光标&#xff0c;只会在光标…

Day61 代码随想录打卡|回溯算法篇---组合优化

本篇是针对上一题的优化&#xff0c;因为在计算所有可能的组合结果时&#xff0c;不是每一条路径都是我们需要遍历的&#xff0c;如图&#xff0c;当n和k都为4的时候&#xff0c;其实最终的结果只有一个[1,2,3,4]是符合结果的。因此我们遍历的时候就不需要遍历每一条边&#xf…

Go线程实现模型-G

G 概述 一个G就代表一个goroutine(或称Go例程)&#xff0c;也与go函数相对应。作为编程人员&#xff0c;我们只是使用go语句向Go的运行时系统提交一个并发任务&#xff0c;而Go的运行时系统则会按照我们要求并发地执行它 Go编译器会把go语句变成对内部函数newproc的调用&…

美德政府转移比特币、以太坊引发市场下跌

小编通过链上地址监控&#xff0c;令人意外的发现德国和美国政府都进行了大规模的数字货币转移&#xff0c;转移了价值 1.5 亿美元的比特币和以太坊。这些大额转移势必引起了数字货币市场分析师和投资者的关注。 BTC价格 从今年起德国政府已转移了其持有的相当一部分比特币&…

【MySQL备份】Percona XtraBackup实战篇

目录 1. 前言 2.准备工作 2.1.创建备份目录 2.2.配置/etc/my.cnf文件 2.3.授予root用户BACKUP_ADMIN权限 3.全量备份 4.准备备份 5.数据恢复 6.总结 "实战演练&#xff1a;利用Percona XtraBackup执行MySQL全量备份操作详解" 1. 前言 本文将继续上篇【My…

玩Stable Diffusion不可不知的5款真人模型!大佬都在用!(附模型包)

模型对于AI绘画起决定性作用&#xff0c;今天推荐5款超好用的Stable Diffusion模型。 这些模型都在市面上收获了各种好评&#xff0c;而且各具特色&#xff0c;能满足你对写实人像的各种要求。 1、MajicMIX realisric 麦橘写实 写实系的人像大模型&#xff0c;具有非常好的质…

数据结构笔记第3篇:双向链表

1、双向链表的结构 注意&#xff1a;这里的 "带头" 跟前面我们说的 "头结点" 是两个概念&#xff0c;实际前面的在单链表阶段称呼不严谨&#xff0c;但是为了同学们更好的理解就直接称为单链表的头结点。 带头链表里的头结点&#xff0c;实际为 "哨兵…

勒索病毒--认知与防范

免责声明:本文仅做技术交流与学习... 目录 应急响应-勒索病毒 1、什么是勒索病毒&#xff1f; 勒索病毒是一种新型电脑病毒&#xff0c;主要以RDP爆破、邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大&#xff0c;一旦感染将给用户带来无法估量的损失。…