【Linux】环境变量

文章目录

  • 1. 环境变量的概念
  • 2. 常见的环境变量
  • 3. 查看环境变量的方法
  • 4. 测试PATH
  • 5. 和环境变量有关的命令
  • 6. 环境变量的组织方式
  • 7. 通过代码获取环境变量
    • 7.1 通过命令行的第三个参数
    • 7.2 通过第三方变量environ
  • 8. 通过系统调用获取
  • 9. 环境变量的全局属性

1. 环境变量的概念

**环境变量(environment variables)**一般是指在操作系统中用来指定操作系统运行环境的一些参数。

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

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

如果你以前在你的Windows笔记本上安装过Java或者python的开发环境,那么你大概率配置过环境变量PATH

那么PATH到底是什么呢?

2. 常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的工作目录(即用户登录Linux机器后所在的默认目录位置)
  • SHELL:当前的shell,它的值一般是/bin/bash.

3. 查看环境变量的方法

  1. 使用echo $NAME来查看指定环境变量,其中NAME就是你要查看的环境变量的名字

image-20231130154952992

  1. 使用env指令可以查看到当前shell运行的所有环境变量

image-20231130204753640

4. 测试PATH

大家有没有想过一个问题:我们自己的代码编译产生的可执行程序和系统自带的指令有什么区别,为什么系统自带的指令能够直接运行,但是我们自己写的代码就不能直接运行,而是需要加上对应的路径?

image-20231130171435600

对于这个问题,我们可以理解成:要执行一条指令(运行一个程序),就要先找到他的位置,我们自己写的程序的位置需要被指定,但是像ls这种系统自带的指令的位置,已经提前被写到PATH环境变量里面了。我们看一下ls的位置

image-20231130171929899

那么我们再来查看一下PATH下的路径有哪些:

image-20231130172115421

可以看到PATH中有很多路径,这些路径通过:隔开,那么其中就有我们看到的ls指令的所在路径/usr/bin。在使用ls命令时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找。因此使用ls指令的时候不带路径也能找到。

知道了不用带路径就能执行的原理之后,那么怎么让我们自己写的程序也能够不带路径执行呢?

根据我们上述的PATH的原理,那么就让PATH中的某一个路径包含我们的程序即可,这里提供两种方法:

1. 将可执行程序拷贝到环境变量PATH的某一路径下

根据我们的分类,这里选择拷贝到/usr/bin目录下

image-20231130192047728

但是非常不建议这么做,因为我们写的程序没有经过测试,会污染系统指令池

2. 将我们写的程序的所在路径添加到PATH中

export PATH=$PATH:指定路径

注意:这里一定要在指定的路径前面加上$PATH,否则之前的路径就被覆盖了

image-20231130193042866


环境变量是怎么来的?

  1. 我们输入指令的地方是一个命令行解释器,命令行解释器也是能够定义变量的

    image-20231130203406150

  2. 当我们登录Linux机器的时候,会自动定义很多变量,这些变量就是环境变量

  3. 在用户家目录可以看到有个文件.bash_profile,这个文件内部就是一个创建环境变量的脚本,在用户登录的时候就会自动执行脚本,创建很多个内存级的环境变量

    image-20231130203027755

5. 和环境变量有关的命令

  1. echo: 显示某个环境变量值

    image-20231130154952992

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

    image-20231130210133058

  3. env: 显示所有环境变量

    image-20231130204753640

  4. unset: 清除环境变量

    image-20231130210530411

  5. set: 显示本地定义的shell变量环境变量 (这里和env做一下区分,env只能显示环境变量,在shell中定义的本地变量,没有经过export之前在env中不显示,但是在set中显示)

    image-20231130210411788

一些常见的环境变量的含义

环境变量名称含义
PATH命令的搜索路径
HOME用户的主工作目录
SHELL当前Shell
HOSTNAME主机名
TERM终端类型
HISTSIZE记录历史命令的条数
SSH_TTY当前终端文件
USER当前用户
MAIL邮箱
PWD当前所处路径
LANG编码格式
LOGNAME登录用户名

6. 环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

image-20231130212846553

7. 通过代码获取环境变量

7.1 通过命令行的第三个参数

我们在学习C语言的时候,见到的第一个经典的代码是是一个打印”hello world”的代码

#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

我们在进行后续的语言的学习的时候,一直写的main函数都是没有参数的,那么main函数可以有参数吗?

答案是可以

在一些地方我们能见到这种main函数的定义方式

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

所以main函数是具有参数的,那么这些参数是什么含义呢?我们使用一段代码来测试一下

image-20231130221326845

image-20231130221407834

编译运行可以发现,main函数的第二个参数(一个指针数组),数组中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空。第一个参数就是这个数组内元素的个数


有了以上的基础之后,我们来看一看mian函数的第三个参数:(对,没错,main函数一共可以有三个参数)

main函数的第三个参数接收的实际上就是环境变量表,我们可以通过main函数的第三个参数来获取系统的环境变量

int main(int argc, char *argv[], char *envp[])

image-20231130222222685

image-20231130222210561

7.2 通过第三方变量environ

除了使用main函数的第三个参数来获取环境变量之外,还可以通过第三方变量:environ来获取到环境变量

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明

image-20231130223054817

运行此代码同样能够获取到环境变量。

8. 通过系统调用获取

除了使用指令来获取环境变量之外,还能够通过系统调用(system call)来获取环境变量

这里介绍一个系统调用:getenv

image-20231130223618494

getenv可以根据所给出的环境变量名在环境变量表中搜索,并返回一个对应的字符串指针,如果没找到就返回NULL

例如:

image-20231130224120370

image-20231130224110597

9. 环境变量的全局属性

为什么我们说环境变量具有全局属性,他是怎么实现的呢?

环境变量具有全局属性是因为它们在整个操作系统中可见且可访问。当一个进程启动时,它会从父进程继承一份环境变量的副本,并且可以修改、添加或删除这些变量。

当你在命令行中设置或修改一个环境变量时,此更改将在当前 Shell 进程中生效,并且可以影响该 Shell 进程及其后续启动的子进程,而我们一般运行的进程都是Shell的子进程,因此其他进程和 Shell 可以看到并使用同样的环境变量,也就实现了环境变量的全局性


操作系统中可见且可访问。当一个进程启动时,它会从父进程继承一份环境变量的副本,并且可以修改、添加或删除这些变量。

当你在命令行中设置或修改一个环境变量时,此更改将在当前 Shell 进程中生效,并且可以影响该 Shell 进程及其后续启动的子进程,而我们一般运行的进程都是Shell的子进程,因此其他进程和 Shell 可以看到并使用同样的环境变量,也就实现了环境变量的全局性


本节完…

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

函数指针数组指针数组传参的本质字符指针(进阶篇)

&#x1f680; 作者&#xff1a;阿辉不一般 &#x1f680; 你说呢&#xff1a;不服输的你&#xff0c;他们拿什么赢 &#x1f680; 专栏&#xff1a;爱上C语言 &#x1f680;作图工具&#xff1a;draw.io(免费开源的作图网站) 如果觉得文章对你有帮助的话&#xff0c;还请点赞…

【带头学C++】----- 八、C++面向对象编程 ---- 8.5 struct结构体类型增强使用说明

目录 8.5 struct结构体类型增强使用说明 8.5.1 C结构体可以定义成员函数 8.5.2 c中定义结构体变量可以不加struct关键字 8.6 bool布尔类型关键字 8.5 struct结构体类型增强使用说明 第六章对结构体的使用、内存对齐以及数组、深拷贝和浅拷贝进行了一个详细的说明&#xff0c…

带键扫的LED专用驱动方案

一、基本概述 TM1650 是一种带键盘扫描接口的LED&#xff08;发光二极管显示器&#xff09;驱动控制专用电路。内部集成有MCU输入输出控制数字接口、数据锁存器、LED 驱动、键盘扫描、辉度调节等电路。TM1650 性能稳定、质量可靠、抗干扰能力强&#xff0c;可适用于24 小时长期…

对抗产品团队中的认知偏误:给产品经理的专家建议

今天的产品经理面临着独特的挑战。他们不仅需要设计和构建创新功能&#xff0c;还必须了解这些功能将如何为客户带来价值并推进关键业务目标。如果不加以控制&#xff0c;认知偏差可能会导致您构建的内容与客户想要的内容或业务需求之间不一致。本文将详细阐述产品经理可以避免…

【EI会议征稿】第四届应用数学、建模与智能计算国际学术会议(CAMMIC 2024)

第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09; 2024 4th International Conference on Applied Mathematics, Modelling and Intelligent Computing 第四届应用数学、建模与智能计算国际学术会议&#xff08;CAMMIC 2024&#xff09;将于…

超详细!Opencv人脸识别!附源码!

一、新建环境 注意&#xff01;&#xff01;确定后需要关闭项目&#xff0c;重新打开&#xff0c;终端的环境才会变化&#xff01;&#xff01; 二、下载安装包&#xff08;只需要3个即可&#xff09; 1. 下载dlib包 pip install dlib-19.19.0-cp38-cp38-win_amd64.whl.whl …

XTU OJ 1339 Interprime 学习笔记

链接 传送门 代码 #include<bits/stdc.h> using namespace std;const int N1e610; //78498 我计算了一下&#xff0c;6个0的范围内有这么多个素数&#xff0c;所以开这么大的数组存素数 //计算的代码是一个循环 int prime[80000]; int a[N],s[N];//s数组是前缀和数组b…

力扣 --- 删除有序数组中的重复项 II

题目描述&#xff1a; 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的…

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测

时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测 目录 时序预测 | Python实现GA-TCN-LSTM遗传算法-时间卷积神经网络-长短期记忆网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 使用先进的机器学习技术和优化算法…

Ubuntu systemd-analyze命令(系统启动性能分析工具:分析系统启动时间,找出可能导致启动缓慢的原因)

文章目录 Ubuntu systemd-analyze命令剖析目录简介systemd与systemd-analyze工作原理 安装和使用命令参数详解用例与示例显示启动时间&#xff08;systemd-analyze time&#xff09;列出启动过程中各个服务的启动时间&#xff08;systemd-analyze blame&#xff09;显示系统启动…

没想法、没经验做不了BI?求你,别再自我pua了

“我没想法&#xff0c;没经验&#xff0c;做不了BI报表&#xff0c;是不是不适合现代职场啊&#xff01;”在网上看到不少姐妹有这种迷惘发言&#xff0c;真的就&#xff0c;恨铁不成钢。求你了&#xff0c;别再自我pua了。你没想法没经验多正常啊&#xff0c;因为你没用过BI报…

Django 模板引擎 (四)

一、Django模板引擎 一个强大的工具&#xff0c;用于在HTML页面中嵌入动态内容。它使用一种被称为Django模板语言&#xff08;Django Template Language&#xff09;的简单而强大的语法来处理模板。该模板语言使用”{% %}”进行标记&#xff0c;用于执行各种操作。 二、Django…

指针数组以及利用函数指针来实现简易计算器及typedef关键字(指针终篇)

文章目录 &#x1f680;前言&#x1f680;两段有趣的代码✈️typedef关键字 &#x1f680;指针数组&#x1f680;简易计算器的实现 &#x1f680;前言 基于阿辉前两篇博客指针的基础篇和进阶篇对于指针的了解&#xff0c;那么今天阿辉将为大家介绍C语言的指针剩下的部分&#…

计算机组成原理期中题库

计算机组成原理题目集 2.1 下面是关于计算机中存储器容量单位的叙述&#xff0c;其中错误的是 A. 最基本的计量单位是字节&#xff08;Byte&#xff09;&#xff0c;一个字节等于8bit B. 一台计算机的编址单位、指令字长和数据字长都一样&#xff0c;且是字节的整数倍 C. 最小…

零基础编程入门视频教程,零基础编程从哪学起,分享中文编程工具构件实例

零基础编程入门视频教程&#xff0c;零基础编程从哪学起&#xff0c;分享中文编程工具构件实例 1、零基础编程入门视频教程&#xff0c;系统化编程教程链接 https://jywxz.blog.csdn.net/article/details/134073098?spm1001.2014.3001.5502 2、零基础编程从哪学起 建议初学…

多多跨境跑出高质量发展“加速度”,解锁拼多多Q3财报背后的王牌

互联网红利渐趋消退&#xff0c;用户拉新难度加大&#xff0c;这些现象也在表明过去电子商务依靠资本、流量快速增长的发展模式已经成为过去式。由高速发展转为高质量发展&#xff0c;在今天每一个经济体与宏观经济发展态势一般&#xff0c;发展的“质量”价值正在被放大开来。…

Zabbix“专家坐诊”第213期问答汇总

问题一 Q&#xff1a;Zabbix报错&#xff1a;Zabbix server is not running :the information displayed may not be current&#xff0c;是什么问题呢&#xff1f; A&#xff1a; 1、数据库软件问题导致导入的zabbix数据库不完整2、zabbix Server配置问题3、zabbix-server没…

超赞!让vue开发效率翻倍的工具分享

分享一个很实用的工具库 VueUse&#xff0c;它是基于 Vue Composition Api&#xff0c;也就是组合式API。支持在Vue2和Vue3项目中进行使用&#xff0c;据说是目前世界上Star最高的同类型库之一。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 它的初衷就…

2023.11.29 深度学习框架理解

2023.11.29 深度学习框架理解 对深度学习框架进行复习&#xff0c;选最简单的“三好学生”问题的四个变化&#xff0c;简要总结其具体思路。 深度学习一开始就是为分类问题研究的&#xff0c;因此其框架的设计都是基于分类的问题&#xff0c;虽然现在也已经演变为可以执行多种…

高效解决在本地打开可视化服务器端的tensorboard

文章目录 问题解决方案 问题 由于连着远程服务器构建模型&#xff0c;但是想在本地可视化却做不到&#xff0c;不要想当然天真的以为CTRLC点击链接http://localhost:6006就真能在本地打开tensorboard。你电脑都没连接服务器&#xff0c;只是pycharm连上了而已 解决方案 你需要…