Linux下的环境变量【详解】

Linux下的环境变量

  • 一,环境变量的概念
  • 1 概述
  • 2 环境变量的分类
  • 3 常见的环境变量
  • 4 查看环境变量
    • 4.1 shell变量
    • 4.2 查看环境变量
  • 5 添加和删除环境变量
    • 5.1 添加环境变量
    • 5.2 删除环境变量
  • 6. 通过代码如何获取环境变量
    • 6.1 命令行的第三个参数
    • 6.2 通过第三方变量environ获取
    • 6.3 通过getenv获取
  • 7. 环境变量的全局性

一,环境变量的概念

1 概述

环境变量一般指的是在操作系统中用于指定操作系统运行环境的一些参数。

  在链接C/C++程序的代码时,会用到动静态库,但是动静态库我们并没有显示的去指定过让系统去那个路径下寻找它,但是每次都可以链接成功,这是因为有了环境变量的帮助。
  环境变量还会有一些特殊的用途,比如可以用作身份验证。

2 环境变量的分类

  • 按照生命周期来分,Linux环境变量可以分为两类:

    1. 永久的:需要用户修改相关的配置文件,变量永久生效
    2. 临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
  • 按照作用域来分,Linux环境变量可以分为:

    1. 系统环境变量:系统环境变量对该系统中所有用户都有效。
    2. 用户环境变量:顾名思义,这种类型的环境变量只对特定的用户有效。

3 常见的环境变量

  • PATH:决定了 shell 将到哪些目录中寻找命令或程序
  • HOME:当前用户主目录(就是用户登录linux系统中时,默认的目录
  • USER:当前用户的用户名。
  • HISTSIZE:历史记录数
  • LOGNAME:当前用户的登录名
  • HOSTNAME:指主机的名称
  • SHELL:当前用户 Shell 类型,它的通常值是/bin/bash
  • LANGUGE:语言相关的环境变量,多语言可以修改此环境变量
  • MAIL:当前用户的邮件存放目录
  • PS1:基本提示符,对于 root 用户是 #,对于普通用户是 $

Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。

4 查看环境变量

4.1 shell变量

  echo的作用是用于字符串的输出.
  运行shell时,会同时存在三种变量:
  1) 局部变量: 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  2) 环境变量: 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  3) shell变量: shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

变量在shell中是这样被定义的name = “tanghuan”,定义变量时,变量名不加美元符号$.

变量的命名规则如下:

  • 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
  • 中间不能有空格,可以使用下划线 _。
  • 不能使用标点符号。
  • 不能使用bash里的关键字(可用help命令查看保留关键字)。

那后面的字符串的双引号是必须的吗?答案是否定的。
字符串可以用单引号,也可以用双引号,也可以不用引号。

  • 单引号字符串的限制:
    • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
    • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。

${NAME} $后面带上一个花括号可以帮助确定变量范围,是良好的编码习惯。

在这里插入图片描述

  • 双引号的优点:
    • 双引号里可以有变量
    • 双引号里可以出现转义字符
      在这里插入图片描述

4.2 查看环境变量

echo $NAME//NAME是环境变量的名称
输入:echo $PATH
会输出这样一串字符:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
他们以 : 作为分隔符,将其分隔成一些子路径,当写入命令时,会自动一个子路径一个子路径的寻找命令自己的源文件,所以就不需要像我们自己写的文件那样,需要主动加上路径(./project),才能被系统所识别运行。

5 添加和删除环境变量

5.1 添加环境变量

  环境变量也是变量,跟shell变量的操作一样,不过PATH=(需要添加的环境变量)这么写可就错了,这样会覆盖掉原来的环境变量,所以得:PATH=$PATH:(需要添加的环境变量).
  需要注意的是,上面那样添加的环境变量在子进程及其后代进程不会产生影响,且只对本次登录有效,具有临时性。要是想对子进程及其后代进程也有效,需要引入export,
  需要这样写:export PATH=$PATH:(需要添加的进程)
  要是不小心像前者那么写并运行了也不用担心,更改的环境变量只限于本次登录,重新登录后。环境变量又会自动恢复成原来的默认路径了。
  原因是前面提到的环境变量的分类可以分为永久性和临时性,在当前终端下声明环境变量,是临时性的。要是想永久性的修改环境变量,需要对配置文件进行操作。

  1. cd ~
  2. vim ./bash_profile
  3. export PATH=$PATH:(需要添加的进程)
  4. 即可永久性的添加环境变量。

5.2 删除环境变量

删除永久性的环境变量需要进入到配置文件中删除相应的命令。

删除临时性的环境变量需要使用到unset (环境变量名称)命令,如unset PATH
在这里插入图片描述
  此时会清除所有的命令,若是只想清除部分路径,可以使用添加环境变量的方法进行修改
比如:PATH=(需要保留的路径):(需要删除的路径)可以:PATH=$(需要保留的路径).

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

6.1 命令行的第三个参数

命令行的第三个参数就是环境变量数组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;
}

在这里插入图片描述

6.2 通过第三方变量environ获取

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

·在这里插入图片描述

6.3 通过getenv获取

在这里插入图片描述

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

在这里插入图片描述

7. 环境变量的全局性

  环境变量通常具有全局属性,可以被子进程继承下去。

  因为创建子进程时,是以父进程为模板或者父进程创建的,进程的环境变量信息可以通过子进程及其后代进程继承。

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("初始PATH的值:%s\n", getenv("PATH"));putenv("PATH=/usr/local/sbin");printf("修改后PATH的值:%s\n", getenv("PATH"));int flag = fork();if(flag == 0){//子进程printf("子进程的PATH:%s\n", getenv("PATH"));                                                                                          }return 0;
}

运行结果为:
在这里插入图片描述


    😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄

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

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

相关文章

Linux 的热插拔机制通过 Udev(用户空间设备)实现、守护进程

一、Udev作用概述 udev机制简介udev工作流程图 二、Linux的热拔插UDEV机制 三、守护进程 守护进程概念守护进程在后台运行基本特点 四、守护进程和后台进程的区别 一、Udev作用概述 udev机制简介 Udev&#xff08;用户空间设备&#xff09;是一个 Linux 系统中用于动态管…

微信号绑定50个开发者小程序以后超额如何删除不用的

我们在开发微信小程序的时候&#xff0c;当前开发者工具登录的必须是该小程序的开发者才能进行小程序的开发&#xff0c;添加开发者的步骤是&#xff1a; 添加开发者 1、进入微信开放平台&#xff0c;然后扫码进入管理平台 2、找到下图所示位置 3:、输入要添加的微信账号&am…

LCD英文字模库(16x8)模拟测试程序

字模 字模&#xff0c;就是把文字符号转换为LCD能识别的像素点阵信息。 电子发烧友可能都熟悉字模的用途。就是调用者通过向LCD模块发送字模数据&#xff0c;LCD根据字模数据在LCD面板上相应的像素描绘出图形或文字。 现在&#xff0c;大部分的LCD都内置了字模库&#xff0c…

11-09 周四 CNN 卷积神经网络基础知识

11-09 周四 CNN 卷积神经网络 时间版本修改人描述2023年11月9日09:38:12V0.1宋全恒新建文档 简介 学习一下CNN&#xff0c;卷积神经网络。使用的视频课程。视觉相关的任务&#xff1a; 人脸识别 卷积网络与传统网络的区别&#xff1a; <img altimage-20231109094400591 s…

电脑怎么录制视频,录制的视频怎么剪辑?

在现今数字化的时代&#xff0c;视频成为了人们日常生活中不可或缺的一部分。因此&#xff0c;对于一些需要制作视频教程、录制游戏或者是进行视频演示的人来说&#xff0c;电脑录屏已经成为了一个必不可少的工具。那么&#xff0c;对于这些人来说&#xff0c;如何选择一个好用…

Zigbee—网络层地址分配机制

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;孤雏 0:21━━━━━━️&#x1f49f;──────── 4:14 &#x1f504; ◀️ ⏸ ▶️ ☰ &#x1f497;关注…

大厂面试题-MySQL中的RR隔离级别,到底有没有解决幻读问题?

就MySQL中的RR(Repeatable Reads)事务隔离级别&#xff0c;到底有没有解决幻读问题发起了激烈的讨论。 一部分人说有&#xff0c;一部分人说没有。 结论&#xff0c;MySQL中的RR事务隔离级别&#xff0c;在特定的情况下会出现幻读的问题。 所谓的幻读&#xff0c;表示在同一…

景联文科技加入中国人工智能产业发展联盟(AIIA),与行业各方共促AI产业发展

近日&#xff0c;景联文科技加入中国人工智能产业发展联盟&#xff08;AIIA&#xff09;&#xff0c;与行业各方共同挖掘人工智能数据的更多价值&#xff0c;破解中国人工智能AI数据短缺难题。 中国人工智能产业发展联盟&#xff08;简称AIIA&#xff09;是在国家发改委、科技部…

GIS入门,xyz地图瓦片是什么,xyz数据格式详解,如何发布离线XYZ瓦片到nginx或者tomcat中

XYZ介绍 XYZ瓦片是一种在线地图数据格式,由goole公司开发。 与其他瓦片地图类似,XYZ瓦片将地图数据分解为一系列小的图像块,以提高地图显示效率和性能。 XYZ瓦片提供了一种开放的地图平台,使开发者可以轻松地将地图集成到自己的应用程序中。同时,它还提供了高分辨率图像和…

红海云签约和兆服饰,科技引领服饰行业人力资源数字化转型

和兆服饰从事多品牌多品类经营管理&#xff0c;旗下拥有POLOSPORT、POLOKIDS、CARTELO等国际品牌。作为一个主打POLO文化的服饰品牌&#xff0c;诞生于美国的POLOSPORT拥有现代感的产品设计、系列化的产品搭配、全方位的服务&#xff0c;是最具美国马球精神的休闲时尚服饰品牌之…

攻防世界题目练习——Web引导模式(四)(持续更新)

题目目录 1. shrine2. very_easy_sql3. fakebook 1. shrine 打开网页题目内容如下&#xff1a; 是一段代码&#xff0c;我们把它还原一下&#xff1a; import flask import osapp flask.Flask(__name__) app.config[FLAG] os.environ.pop(FLAG) #这里应该是将config配置里…

【Docker】设置容器系统字符集zh_CN.UTF-8退出失效:关于Docker容器配置环境变量,再次进入失效问题

设置容器系统字符集zh_CN.UTF-8退出失效&#xff1a;关于Docker容器配置环境变量&#xff0c;再次进入失效问题 修改正在运行的Docker容器内的字符集: 先进入Docker容器&#xff1a;docker exec -it 容器ID /bin/bash查看是否支持中文字符集&#xff1a;locale -a | grep zh&a…

PCIe寄存器之二

关键字索引&#xff1a; CAP_PM 对应&#xff1a;Capabilities: [c0] Power Management CAP_MSI 对应&#xff1a;Capabilities: [c8] MSI CAP_MSIX对应&#xff1a;Capabilities: [e0] MSI-X CAP_EXP 对应&#xff1a;Capabilities: [70] Express (v2) Endpoint 以上 [] 内的…

uni-app前端H5页面底部内容被tabbar遮挡

问题&#xff1a; 在用uniapp写小程序的时候&#xff0c;底部有一部分内容没显示出来&#xff0c;被底部的tabbar遮挡住了 解决&#xff1a; 给最外部的view设置样式padding-bottom: var(--window-bottom)&#xff0c;如下 参考&#xff1a; 参考1 参考2 使用 uni-app 框…

推送效率低?MobPush带着APP消息推送一站式解决方案来了

随着移动应用竞争的日趋激烈&#xff0c;如何拉新促活&#xff0c;保持用户粘性成为各大APP的运营的焦点和核心。作为一种有效的营销和用户保留工具。APP消息推送可以有效提高用户参与度&#xff0c;增强用户忠诚度&#xff0c;并最终提高业务效益。然而随着各大APP推送的高度同…

UML与PlantUML简介

UML与PlantUML 1、UML与PlantUML概述2、PlantUML使用 1、UML与PlantUML概述 UML&#xff08;Unified Modeling Language&#xff09;是一种统一建模语言&#xff0c;为面向对象开发系统的产品进行说明、可视化、和编制文档的一种标准语言&#xff0c;独立于任何具体程序设计语言…

YOLOv8-Seg改进: 分割小目标系列篇 | SPD-Conv,提升分割小目标和弱小分割图精度

🚀🚀🚀本文改进:SPD-Conv由一个空间到深度(SPD)层和一个无卷积步长(Conv)层组成,可以应用于大多数CNN体系结构,特别是在处理低分辨率图像和分割小目标等更困难的任务时。 🚀🚀🚀SPD-Conv 分割小目标检测首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http:…

什么是Node.js的NVM(Node Version Manager)?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

YOLOv5检测界面-PyQt5实现

1.将detect.py运用到界面 要将 YOLOv5 的检测结果与 PyQt 界面结合&#xff0c;你需要进行一些额外的步骤。以下是一个简单的示例代码&#xff0c;展示如何使用 YOLOv5 进行目标检测并在 PyQt 界面中显示结果。 首先&#xff0c;确保你已经安装了必要的库&#xff1a; pip …

文件包含 [ZJCTF 2019]NiZhuanSiWei1

打开题目 代码审计 if(isset($text)&&(file_get_contents($text,r)"welcome to the zjctf")){ 首先isset函数检查text参数是否存在且不为空 用file_get_contents函数读取text制定的文件内容并与welcome to the zjctf进行强比较 echo "<br><h…