Linux中的环境变量

一、基本概念

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

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

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

二、获取和修改环境变量

命令:env。可以获取系统中全部的环境变量。

image-20240715161045701

可以看到环境变量是非常多的,理解几个重要的。

USER=csj

解释:当前登录的用户名。

PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/csj/.local/bin:/home/csj/bin

解释:可执行文件的目录路径列表。

HOME=/home/csj

解释:用户登录目录路径(也就是家目录)。

PWD=/home/csj

解释:当前工作目录。


当我们登录普通用户的时候和登录root用户的时候,pwd怎么就知道我们在哪个目录下?

image-20240715162749731

image-20240715162850669

登录的时候:

  • 输入用户名和密码
  • 认证
  • 形成环境变量(肯定不止一个,PATH,PWD,HOME)
  • 根据用户初始化HOME=/root或者HOME=/home/xxx
  • cd $HOME

就这样不同用户登录的时候,它的家目录都是确定好的。

三、PATH环境变量

命令echo $PATH查看PATH环境变量。

image-20240715201242166

以冒号分割。

PATH环境变量是一个非常重要的环境变量。

它用于指定操作系统在执行命令时搜索可执行文件的目录路径列表。

比如ls命令,它不在当前的工作目录下,但是我们可以直接使用呢?原因就是ls是环境变量/usr/bin下的一个可执行文件。

image-20240715201907887


在windows系统中也是一样的,环境变量也是有大作用的,比如我们可以将QQ的路径添加到PATH环境变量中,使用cmd命令也可以打开QQ。

image-20240715202459006

image-20240715202534296

也是一样,在cmd运行框中,虽然qq的路径不在该路径下,但是一样可以运行,这就是PATH环境变量的作用,由此可见,PATH环境变量是具有全局性的。


运行可执行程序,需要加上./,表明在当前路径下,我们可以将该可执行程序路径加入到PATH中去,就可以实现直接使用可执行程序。

添加路径到PATH中去,命令:PATH:$PATH:路径

image-20240715204601566

还可以PATH=“”,将PATH直接置为空。注意这里所有修改PATH的做法都是临时性的,它是在内存中实现的,当你重启xshell后,环境变量又会重置(因为.bash_profile文件并没有修改)。

image-20240715205142156

可以发现,PATH置为空之后,很多命令是无法运行的,但是pwd却可以运行,这与后面说的内建命令有关!

四、环境变量的三种获取方式

通过代码如何获取环境变量

①命令行第三个参数

main函数的前两个参数叫做命令行参数,那main函数还有第三个参数吗?其实是有的,叫做环境变量参数。

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

image-20240715210126661

通过main函数第三个参数,同样可以得到环境变量。

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

image-20240715210651706

通过系统调用获取或设置环境变量

③getenv访问特定的环境变量

image-20240715210738744

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

image-20240715211141658

五、配置文件

系统启动我们的程序的时候,可以选择给我们的进程(main)提供两张表:命令行参数表和环境变量表

命令行启动的进程都是shell/bash的子进程,子进程的命令行参数和环境变量是父进程传给我们的!

比如我们可以使用fork创建子进程:

#include<stdio.h>
#include<unistd.h>
int main()
{pid_t id=fork();if(id==0){extern char**environ;int i=0;for(;environ[i];i++){printf("%d:%s\n",i,environ[i]);}}return 0;
}

image-20240715234842126

再次验证了环境变量具有全局性!!!


那shell/bash的进程的命令行参数和环境变量又从哪里来呢?

在用户的家目录~下有一个文件隐藏文件:.bash_profile

环境变量的信息就是以脚本配置文件的形式存在在.bash_profile中的。

image-20240715231449878

image-20240715231544502

总结:每一次登录的时候,bash进程都会读取该文件中的内容,形成自己的环境变量信息!

六、本地变量vs环境变量

我们是可以自己定义环境变量的,和环境变量的格式一样,左边大写,中间等于,右边为变量值。

比如:MYENV_109=hellolinux!

image-20240716160612015

虽然echo可以显示出内容,但是显然我们的程序是读取不到该环境变量,环境变量表中并没有添加上该环境变量。

这样的环境变量叫做本地变量。

要将本地变量导入到环境变量表中去,使用命令export+本地变量。

image-20240716161000433

这样虽然导入到了环境变量表中,但是这是在内存中的,它是临时性的,当我们重新登录后,该环境变量又不在了。

刚刚我们说了,环境变量表信息是从文件.bash_profile中来的,需要永久保存我们自己定义的环境变量,就需要修改该文件的内容。

image-20240716162238140

在该文件中导入自己定义的环境变量,需要使得环境变量生效,需要重新登录一下,使得bash重新读取该文件。

image-20240716162301286


总结

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

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

这里就有个问题了,本地变量使用echo可以显示出来,但是我们自己写的程序,也就是bash的子进程,就没法看到本地变量。

echo同样是bash创建的子进程啊,说了本地变量只能在bash进程内部有效哇,和子进程无关哒,好奇怪哦。

其实这里就是我们下面要说的!!!

七、常规命令和内建命令

linux命令分类:

①常规命令,shell fork创建出的子进程。

②内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量咯。

显然echo就是一个内建命令!!!

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

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

相关文章

Cesium能做啥,加载哪些数据源,开源免费用商用吗?这里告诉你。

很多小伙伴对Cesium是什么&#xff0c;一知半解&#xff0c;本文是基础知识的扫盲&#xff0c;为大家分享cesium是什么、能做什么、默认数据是什么&#xff0c;为什么首先要进行数据加载&#xff0c;要加载哪些数据&#xff0c;希望通过这些带你入个门&#xff0c;欢迎点赞评论…

vue仿甘特图开发工程施工进度表

前言 本文是根据项目实际开发中一个需求开发的demo&#xff0c;仅用了elementUI&#xff0c;可当作独立组件使用&#xff0c;C V即用。 当然没考虑其他的扩展性和一些数据的校验&#xff0c;主要是提供一个处理思路&#xff0c;有需要的小伙伴可以直接复制&#xff1b;本demo的…

高职院校人工智能人才培养成果导向系统构建、实施要点与评量方法

一、引言 近年来&#xff0c;人工智能技术在全球范围内迅速发展&#xff0c;对各行各业产生了深远的影响。高职院校作为培养高技能人才的重要基地&#xff0c;肩负着培养人工智能领域专业人才的重任。为了适应社会对人工智能人才的需求&#xff0c;高职院校需要构建一套科学、…

【node-RED 4.0.2】连接 Oracle 数据库踩坑解决,使用模组:node-red-contrib-agur-connector

关于 Oracle Oracle 就好像一张吸满水的面巾纸&#xff0c;你稍一用力它就烂了。 PS&#xff1a;我更新了更好的模组的教程&#xff0c;这篇已经是旧款的教程&#xff0c;但是它仍旧包含了必要的配置环境变量等操作。 最新的模组教程&#xff1a;node-red-contrib-agur-connec…

AI时代:探索个人潜能的新视角

文章目录 Al时代的个人发展1 AI的高速发展意味着什么1.1 生产力大幅提升1.2 生产关系的改变1.3 产品范式1.4 产业革命1.5 Al的局限性1.5.1局限一:大模型的幻觉1.5.2 局限二&#xff1a;Token 2 个体如何应对这种改变?2.1 职场人2.2 K12家长2.3 大学生2.4 创业者 3 人工智能发展…

解决vue3中el-input在form表单按下回车刷新页面

问题&#xff1a;在input框中点击回车之后不是调用我写的回车事件&#xff0c;而是刷新页面 原因&#xff1a; 如果表单中只有一个input 框则按下回车会直接关闭表单 所以导致刷新页面 解决方法 &#xff1a; 再写一个input 表单 &#xff0c;并设置style"display:none&…

SimMIM:一个类BERT的计算机视觉的预训练框架

1、前言 呃…好久没有写博客了&#xff0c;主要是最近时间比较少。今天来做一期视频博客的内容。本文主要讲SimMIM&#xff0c;它是一个将计算机视觉&#xff08;图像&#xff09;进行自监督训练的框架。 原论文&#xff1a;SimMIM&#xff1a;用于掩码图像建模的简单框架 (a…

解决虚拟机与主机ping不通,解决主机没有vmware网络

由于注册表文件缺失导致&#xff0c;使用这个工具 下载cclean 白嫖就行 https://www.ccleaner.com/ 是 点击修复就可以了

防火墙双机热备带宽管理综合实验

一、实验拓扑 二、实验要求 12&#xff0c;对现有网络进行改造升级&#xff0c;将当个防火墙组网改成双机热备的组网形式&#xff0c;做负载分担模式&#xff0c;游客区和DMZ区走FW3&#xff0c;生产区和办公区的流量走FW1 13&#xff0c;办公区上网用户限制流量不超过100M&am…

技术速递|Let’s Learn .NET Aspire – 开始您的云原生之旅!

作者&#xff1a;James Montemagno 排版&#xff1a;Alan Wang Let’s Learn .NET 是我们全球性的直播学习活动。在过去 3 年里&#xff0c;来自世界各地的开发人员与团队成员一起学习最新的 .NET 技术&#xff0c;并参加现场研讨会学习如何使用它&#xff01;最重要的是&#…

Java IO中的 InputStreamReader 和 OutputStreamWriter

Java IO 的流&#xff0c;有三个分类的维度&#xff1a; 输入流 or 输出流节点流 or 处理流字节流 or 字符流 在Java IO库中&#xff0c;InputStreamReader和OutputStreamWriter是两个非常重要的类&#xff0c;它们作为字符流和字节流之间的桥梁。 这两个类使得开发者可以方…

整数或小数点后补0操作

效果展示&#xff1a; 整数情况&#xff1a; 小数情况&#xff1a; 小编这里是以微信小程序举例&#xff0c;代码通用可兼容vue等。 1.在utils文件下创建工具util.js文本 util.js页面&#xff1a; // 格式…

淘宝扭蛋机小程序:旋转惊喜,开启购物新篇章!

在追求创新与惊喜的购物时代&#xff0c;淘宝再次引领潮流&#xff0c;精心打造——淘宝扭蛋机小程序&#xff0c;为您的购物之旅增添一抹不同寻常的色彩。这不仅仅是一个购物工具&#xff0c;更是一个充满趣味、互动与惊喜的宝藏盒子&#xff0c;等待您来探索与发现。 【旋转…

通过Dockerfile构建镜像

案例一&#xff1a; 使用Dockerfile构建tomcat镜像 cd /opt mkdir tomcat cd tomcat/ 上传tomcat所需的依赖包 使用tar xf 解压三个压缩包vim Dockerfile FROM centos:7 LABEL function"tomcat image" author"tc" createtime"2024-07-16"ADD j…

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型跑开源yolov5物体检测并体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆&#x1f496; 远程ssh&#x1f496;查看ubuntu桌面&#x1f496; 远程向日葵 二、部署LLMS大模型&yolov5物体检测⭐2.1 快速启动LLMS大模型&#x1f496;拉取代码&#x1f496;下载mode数据&#x…

第九课:服务器发布(静态nat配置)

一个要用到静态NAT的场景&#xff0c;当内网有一台服务器server1&#xff0c;假如一个用户在外网&#xff0c;从外网访问内网怎么访问呢&#xff0c;无法访问&#xff0c;这是因为外网没办法直接访问内网&#xff0c;这时候需要给服务器做一个静态NAT。 静态NAT指的是给服务器…

gltf模型加载 与3d背景贴图

Poly Haveny 用于3d模型跟贴图下载资源 Sketchfab 里面有免费的模型 模型放到public里面 const loader new GLTFLoader()// 加载GLTF模型loader.load(/scene.gltf,(gltf) > {// 将加载的模型添加到场景中scene.add(gltf.scene)// 现在你可以开始渲染循环了let angle …

深度学习落地实战:基于UNet实现血管瘤超声图像分割

前言 大家好&#xff0c;我是机长 本专栏将持续收集整理市场上深度学习的相关项目&#xff0c;旨在为准备从事深度学习工作或相关科研活动的伙伴&#xff0c;储备、提升更多的实际开发经验&#xff0c;每个项目实例都可作为实际开发项目写入简历&#xff0c;且都附带完整的代…

类和对象(补充)

1.static成员 1>静态成员变量在类外进行初始化 2>静态成员变量为所有类对象所共享&#xff0c;不属于任何具体对象&#xff0c;存放在静态区中 3>静态成员函数没有this指针&#xff0c;可访问其他静态成员&#xff0c;但不可访问非静态的 4>非静态成员函数可以…

jmeter做接口压力测试_jmeter接口性能测试

jmeter是apache公司基于java开发的一款开源压力测试工具&#xff0c;体积小&#xff0c;功能全&#xff0c;使用方便&#xff0c;是一个比较轻量级的测试工具&#xff0c;使用起来非常简单。因为jmeter是java开发的&#xff0c;所以运行的时候必须先要安装jdk才可以。jmeter是免…