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;
}

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


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

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

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

相关文章

Android笔记(十二):结合Compose实现Handler机制处理多线程的通信

在Android应用中常常结合多线程处理多个任务。不可避免&#xff0c;多个线程之间需要数据通信。Hanlder消息处理机制是异步处理的方式之一。通过Handler机制可以实现在不同的线程之间的通信。 一、主线程和工作线程 1.主线程 一个Android的移动应用启动时会单独启动一个进程…

华为认证 | 11月底这门HCIP认证即将发布!

非常荣幸地通知您&#xff0c;华为认证HCIP-Storage V5.5&#xff08;中文版&#xff09;预计将于2023年11月30日正式对外发布。为了帮助您做好学习、培训和考试计划&#xff0c;现进行预发布通知&#xff0c;请您关注。 01 发布概述 基于“平台生态”战略&#xff0c;围绕“云…

理解RNN以及模型搭建代码

RNN结构 这是一张不直观易懂的RNN结构示意图。但也是大家见得最多结构示意图。 RNN模型解释 RNN一文就讲解清楚的博客&#xff0c;看这里&#xff1a;https://zhuanlan.zhihu.com/p/408998328 RNN为什么梯度消失和梯度爆炸&#xff0c;看这里&#xff1a;https://zhuanlan.z…

Windows搭建Web站点:免费内网穿透发布至公网

目录 什么是cpolar&#xff1f; 概述 1. 注册并安装cpolar内网穿透 2. 搭建一个静态Web站点 2.1 下载演示站点 2.2 本地运行演示站点 2.3 本地浏览测试站点是否正常 3. 本地站点发布公网可访问 3.1 登录cpolar web ui管理界面 3.2 启动website隧道 3.3 获取公网URL地…

AI:76-基于机器学习的智能城市交通管理

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

Power Automate-创建和运行

网站&#xff1a;Microsoft Power Automate 根据自己需求选择创建 选择需要的触发方式 点击添加新步骤 可以选择多种微软应用或者自定义应用连接 此处以向SharePoint列表追加项为例&#xff0c;要提前创建好SharePoint列表&#xff0c;并写好表结构 搜索SharePoint&#xff0…

【机器学习】给大家推荐几个资源

我写博客的目的就是让大家了解人工智能背后的数学原理&#xff0c;但人工智能这个话题太大了&#xff0c;背后涉及到的知识非常庞大&#xff0c;仅靠写几篇文章传播力度有限&#xff0c;况且知识传播过程中也容易引入误解&#xff0c;所以授之以鱼不如授之以渔&#xff0c;这里…

NIO 笔记(二)Netty框架专题

【笔记来自&#xff1a;it白马】 Netty框架 前面我们学习了Java为我们提供的NIO框架&#xff0c;提供使用NIO提供的三大组件&#xff0c;我们就可以编写更加高性能的客户端/服务端网络程序了&#xff0c;甚至还可以自行规定一种通信协议进行通信。 NIO框架存在的问题 但是之…

openfeign客户端A调用服务B,服务B抛出异常时,客户端A接收的几种情况

openfeign客户端A调用服务B&#xff0c;服务B抛出异常时&#xff0c;客户端A接收的几种情况 一、openfeign客户端调用远程服务时&#xff0c;远程服务抛出异常后&#xff0c;根据调用方法的返回类型的不同&#xff0c;会有不同的返回结果0 先看非openfeign调用的情况&#xff1…

在vue中如果头像为空时用姓名第一个字当头像

业务场景:当个人资料或者用户头像没有图片时&#xff0c;默认使用户名字中第一个汉字做头像。 效果图&#xff1a; 完整代码&#xff1a; <el-avatarsize"large" style"width: 45px; height: 45px; line-height: 45px; font-size: 24px"v-if"…

海淀区委网信办领导到中睿天下调研

近日&#xff0c;北京市海淀区委宣传部副部长&#xff0c;海淀区委网信办主任黄英、海淀区委网信办副主任陈魁一行到中睿天下北京总部调研&#xff0c;中睿天下副总经理李小琼、联合创始人魏海宇、国防营销中心总经理吕宗辉参加。 海淀区委网信办一行参观了中睿天下展厅&#x…

元核云亮相金博会,智能质检助力金融合规

11月初&#xff0c;第五届中新&#xff08;苏州&#xff09;数字金融应用博览会&#xff5c;2023金融科技大会在苏州国际博览中心举办&#xff0c;围绕金融科技发展热点领域及金融行业信息科技领域重点工作&#xff0c;分享优秀实践经验&#xff0c;探讨数字化转型路径与未来发…

基于IGT-DSER智能网关实现GE的PAC/PLC与罗克韦尔(AB)的PLC之间通讯

工业自动化领域的IGT-DSER智能网关模块支持GE、西门子、三菱、欧姆龙、AB等各种品牌的PLC之间通讯(相关资料下载)&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪表等设备通讯。网关有多个网口、串口&#xff0c;也可选择WIFI无线通讯。无需编程开发&#xff0c;只…

3线硬件SPI+DMA驱动 HX8347 TFT屏

3线硬件SPIDMA驱动 HX8347 TFT屏&#xff0c;实现用DMA清屏。 参考&#xff1a;基于stm32 标准库spi驱动st7789彩屏TFT(使用DMA)-技术天地-深圳市修德电子有限公司 一、源码 HX8347.h #ifndef USER_HX8347_H_ #define USER_HX8347_H_#define SPI_hardware #define SPI_hardw…

基于表面电势的AlGaN/GaN MODFET紧凑模型

标题&#xff1a;A Surface-Potential-Based Compact Model for AlGaN/GaN MODFETs 来源&#xff1a;IEEE TRANSACTIONS ON ELECTRON DEVICES&#xff08;11年&#xff09; 摘要 - 本文首次构建了基于表面势&#xff08;SP&#xff09;的AlGaN/GaN调制掺杂场效应晶体管&#…

说说地址栏输入 URL 敲下回车后发生了什么?

面试官&#xff1a;说说地址栏输入 URL 敲下回车后发生了什么? 一、简单分析 简单的分析&#xff0c;从输入 URL到回车后发生的行为如下&#xff1a; URL解析DNS 查询TCP 连接HTTP 请求响应请求页面渲染 二、详细分析 URL解析 首先判断你输入的是一个合法的 URL 还是一个…

C++初阶(九)内存管理

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、C/C内存分布1、选择题2、填空题3、sizeof 和 strlen 区别&#xff1f;4、总结 二、 C语言…

19.8 Boost Asio 异或加密传输

异或加密是一种对称加密算法&#xff0c;通常用于加密二进制数据。异或操作的本质是对两个二进制数字进行比较&#xff0c;如果它们相同则返回0&#xff0c;如果不同则返回1。异或加密使用一把密钥将明文与密文进行异或运算&#xff0c;从而产生密文。同时&#xff0c;使用相同…

数字马力笔试面试复盘

笔试——10月9日19&#xff1a;00 单选&#xff1a;30题 16.如何获取AJAX 请求的响应状态码? A通过AJAX对象的 statusCode 属性获取 B通过AJAX对象的responseText 属性获取C通过AJAX对象的status 属性获取 D通过AJAX对象的responseCode属性获取 答案&#xff1a;可以通过AJAX…

Python学习笔记--枚举类的使用

一、枚举类的使用 实际开发中&#xff0c;我们离不开定义常量&#xff0c;当我们需要定义常量时&#xff0c;其中一个办法是用大写变量通过整数来定义&#xff0c;例如月份&#xff1a; JAN 1 FEB 2 MAR 3 ... NOV 11 DEC 12当然这样做简单快捷&#xff0c;缺点是类型是…