[Linux]环境变量

[Linux]环境变量

文章目录

  • [Linux]环境变量
    • 环境变量的概念
    • 查看环境变量
    • 环境变量的加载原理
    • 环境变量的添加
    • 刷新环境变量
    • 配置文件的路径

环境变量的概念

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

环境变量的本质:一张内存级的表,在用户登录系统的时候,为用户形成属于自己的环境变量表。表结构示意图如下:

image-20230825100446726

环境变量是从配置文件中读取获得的。

每一个环境变量都有自己的用途,有的是用于路径搜索,有的是用于身份认证,有的是用于库的查找等等。

查看环境变量

  1. Linux系统下输入env指令查看所有环境变量

image-20230824144857767

其中一些常见的环境变量:

  • SHELL : 当前Shell,它的值通常是/bin/bash
  • USER:当前用户名
  • PWD:当前用户所处的路径
  • HOME:当前用户的家目录
  • LOGNAME:用户登录时的名字

环境变量中值得注意的是PATH环境变量,他记录了Linux系统中的系统指令程序路径,编程语言的动静态库地址。因此同样是可执行程序我们自己编写的程序需要加路径运行,而系统指令不用,并且编译代码时,不需要关心动静态库的链接问题,因为环境变量中记录了路径,编译器会根据环境变量的路径查找。

  1. Linux系统下输入echo $NAME 指令查看特定环境变量,其中NAME是所要查看的环境变量名

image-20230824145401729

说明: 一些特定的环境变量比如LOGNAME不同的用户的环境变量是不同的。

  1. 编写代码查看环境变量
  • 通过main函数的参数查看

main函数是有三个参数的,即使我们不写明,编译器也在编译时自动加上并接收参数,其中第三个参数是一个名为envp的指针数组,其接收的参数就是环境变量。envp的数据中最后一个有效数据的下一个数据是空指针,因此编写如下代码查看环境变量:

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

编译后运行程序查看结果:

image-20230824153440087

  • 通过全局变量查看

在Linux系统头文件unistd.h中有一个全局变量,名为environ的二级指针,指向环境变量数据表,environ的数据中最后一个有效数据的下一个数据是空指针。因此编写如下代码查看环境变量:

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

编译后运行程序查看结果:

image-20230824153816060

  • 调用系统函数查看

Linux系统提供了系统函数getenv来获取特定的环境变量。因此编写如下代码查看环境变量:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{char* usr = getenv("USER");printf("当前用户名为:%s\n", usr);return 0;
}

getenv函数所在的头文件是stdlib.h,参数要查看的特定环境变量,编译后运行程序查看结果:

image-20230824155926150

环境变量的加载原理

环境变量是从系统配置文件获取数据的一张内存级的表,在Linux操作系统下每启动一个shell进程,shell进程内部就会执行创建环境变量表的代码,然后从配置文件中获取数据加载到自身创建的环境变量表中。由于我们使用Linux操作系统都是通过shell进行命令行解释然后启动子进程完成功能,因此在Linux操作系统下启动的进程都可以通过main函数的参数获取到环境变量,如下:

image-20230825102435919

说明:

  • 修改某个shell进程自身的环境变量表不影响新启动的shell进程。
  • 修改所有新启动的shell进程的环境变量需要修改配置文件。

环境变量的添加

  1. 给当前shell进程添加本地变量

直接输入NAME=VAL给当前shell进程添加本地变量:

image-20230825103508771

shell进程的本地变量只在shell进程内部有效,由shell启动的子进程都无法接收到本地变量。为了验证子进程无法接收到该本地变量编写如下代码:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>int main()
{char* env = getenv("HELLO");if (env) printf("%s\n", env);else printf("该环境变量不存在\n");return 0;
}

编译运行程序查看结果:

image-20230825103959849

  1. 给当前shell进程添加全局变量

输入export 本地变量或者export NAME=VAL添加全局变量:

image-20230825104111625

export指令会将变量添加到shell进程的环境变量表中,因此shell进程的全局变量可以由shell启动的子进程都接收。(图中myproc进程代码同上)

刷新环境变量

.操作符

. 配置文件名 可以刷新当前shell进程的环境变量,将配置文件中的数据加载到环境变量表中使其生效。

source命令

source 配置文件名可以刷新当前shell进程的环境变量,将配置文件中的数据加载到环境变量表中使其生效。

配置文件的路径

在Linux系统家目录下的每个用户目录中都会存在两个配置文件.bash_profile.bashrc

image-20230825111017108

.bash_profile.bashrc文件中都有一些环境变量和加载其他配置文件的shell脚本,shell脚本的功能是到对应的路径下加载配置文件,为用户创建shell进程时就会先加载.bash_profile.bashrc文件然后执行其中的shell脚本完成环境变量的加载。

.bash_profile内容示意图:

image-20230825111406724

.bashrc内容示意图:

image-20230825111330098

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

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

相关文章

AMEYA360代理品牌:纳芯微芯片解决方案为光伏市场赋能

近年来&#xff0c;光伏市场进入了一个新的增长维度。SolarPower Europe数据显示&#xff0c;2022年全球光伏新增装机量达239GW&#xff0c;占所有可再生能源新增容量的三分之二。国家能源局也宣称&#xff0c;2022年我国工商业光伏新增装机达25.87GW&#xff0c;同比增长236.7…

C#面向对象程序设计之变量的作用域,深入浅出 入门和进阶教程3

1、效果镇楼: 最近忒忙了!真的忙到不可开交的呢,繁杂业务的处理真的不是您,我个人想象的样子,完全比您个人想象的要复杂至少三倍以上的难度!也是客观事实。 菜鸟程序员面临的客观残酷现实!尤其您这个年龄阶段,实在是堪忧,尴尬的很啊,非常严峻的形势,也可以说特别严峻…

Element table根据字段合并表格(可多字段合并),附带拖拽列动态合并

效果如图&#xff0c;姓名 数值1 字段进行自动合并 封装合并列js - tableMerge.js // 获取列合并的行数 // params // tableData: 表格数据 // mergeId: 合并的列的字段名 export const tagRowSpan (tableData, mergeId) >{const tagArr [];let pos 0;tableData.map((i…

vue组件的scope 以及 如何样式穿透

个人复习&#xff01;&#xff01;&#xff01; 有什么用 让当前组件的样式不会修改到其它地方的样式&#xff0c;使用了data-v-hash的方式来使css有了它对应模块的标识 实现原理 1、给HTML的dom节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个dom 元素…

诺依框架ruoyi.js添加默认当年日期范围

ruoyi.js添加方法 // 默认当年日期范围如&#xff1a;2023-01-01到2023-08-22&#xff08;至今&#xff09; export function defaultYearDate(data) {// this.dateDefaultShow new Date();// this.dateDefaultShow.setMonth(new Date().getMonth() - 1);const end new Date…

ubuntu 对多CPU统一设置高性能模式

文章目录 一、问题描述二、软件安装与设置三、查看各CPU状态四、开机默认高性能4.1 安装cpufrequtils4.2 编写脚本4.3 设为默认开机脚本 参考链接 一、问题描述 之前在网上找到的CPU设置高性能模式&#xff0c;只能设置CPU0单个CPU&#xff0c;下述是对多核CPU统一设置工作模式…

Linux 设置mysql开机自启动和安装JDK

0目录 1.mysql设置开机自启动 2.linux安装jdk 1.mysql设置开机自启动 去到cd /etc/rc.d/init.d目录 创建一个sh脚本 编辑脚本 设置开机自启动 重启 检查是否自启动 2.linux安装jdk 下载安装包 放在opt目录下 新建soft文件夹&#xff08;opt目录下&#xff09;…

【VS_C++基础知识】

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享VS_C的基础知识&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点赞就…

一套基于C#语言开发的LIMS实验室信息管理系统源码

实验室信息管理系统&#xff08;LIMS)是指帮助实验室组织和管理实验数据的计算机软件系统&#xff0c;它将实验室操作有机地组织在一起&#xff0c;以满足实验室工作流程的所有要求。它能以不同的方式支持实验室的工作&#xff0c;从简单的过程(如样品采集和入库)到复杂的流程(…

stm32的位带操作

在51单片机中&#xff0c;我们可以使用P2^1来对单片机的某一位进行操作&#xff0c;到了stm32&#xff0c;我们通过位带操作&#xff0c;将寄存器的每一位映射到一个32位的地址。如下是我查资料摘录的一些图片。 映射方式 SRAM: AliasAddr 0x22000000 (A-0X20000000)*8*4n*4…

vue 简单实验 v-if 条件判定

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"conditional-rendering"><span v-if"seen">现在你看到我了</span> </div> <script> const C…

rust库学习-env_logger(actix-web添加彩色日志、rust添加彩色日志 )

文章目录 介绍actix-web启用彩色日志crate地址&json格式日志 我们在进行rust的web开发时&#xff0c;如果不指定日志&#xff0c;就不会有输出&#xff0c;非常不友好 这里我们使用env_logger进行日志打印 介绍 env_logger 需要配合 log 库使用, env_logger 是 Rust 社区…

LeetCode面试经典150题(day 2)

26. 删除有序数组中的重复项 难度:简单 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

matlab 点云精配准(2)——point to plane ICP(点到面的ICP)

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示1、初始位置2、配准结果四、参考链接五、测试数据本文由CSDN点云侠原创,matlab 点云精配准(2)——point to plane ICP(点到面的ICP)。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一…

Linux:shell脚本:基础使用(5)《正则表达式-sed工具》

sed是一种流编辑器&#xff0c;它是文本处理中非常中的工具&#xff0c;能够完美的配合正则表达式使用&#xff0c;功能不同凡响。 处理时&#xff0c;把当前处理的行存储在临时缓冲区中&#xff0c;称为“模式空间”&#xff08;pattern space&#xff09;&#xff0c;接着用s…

Linux journalctl命令详解(journalctl指令)(systemd服务默认日志管理工具)

文章目录 Linux Journalctl命令详解1. Journalctl简介2. Journalctl基础使用3. 过滤日志条目4. 时间戳和日志轮转5. 高级应用6. journalctl --help指令文档英文中文 注意事项journal日志不会将程序输出的空行显示&#xff0c;日志会被压缩得满满当当。journal日志不会自动持久化…

由JDK bug引发的线上OOM

由JDK bug引发的线上OOM 最近生产环境的一个应用忽然发生了OOM&#xff0c;还好是业务低峰期&#xff0c;没有导致什么严重问题&#xff0c;下面记录下本次排查的过程&#xff1b; 故障临时处理 在某天下午&#xff0c;正在愉快的写代码时&#xff0c;忽然看到业务反馈支付服…

Ubuntu中删除LibreOffice方法

目录 删除LibreOffice套件 删除所有与LibreOffice相关的软件包 删除与LibreOffice相关的配置文件 删除LibreOffice套件 1、打开终端。您可以使用快捷键Ctrl Alt T来打开终端。 2、输入以下命令以卸载LibreOffice套件&#xff1a; sudo apt-get remove libreoffice* 删…

美容行业如何快速搭建自己的预约小程序?

现在&#xff0c;搭建一个专属于美容行业的预约小程序不再是只有程序员才能做到的事情了。有了一些小程序制作平台的存在&#xff0c;任何人都可以轻松地制作出自己的小程序。下面&#xff0c;我将揭秘一个快速搭建专属美容行业预约小程序的秘诀。 首先&#xff0c;登录小程序制…

数学建模(五)非线性规划

课程推荐&#xff1a; 13 非线性规划算法在数学建模中的应用与编程实现_哔哩哔哩_bilibili 一、非线性规划模型 如果目标函数或约束条件中包含非线性函数&#xff0c;就称这种规划问题为非线性规划问题。一般说来&#xff0c;解非线性规划要比解线性规划问题困难得多。而且&am…