【从浅学到熟知Linux】环境变量详谈(含使用程序获取环境变量的3种方法、如何查看环境变量)

news2024/12/23 9:09:39

在这里插入图片描述

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程及数据库等内容。
🎯每天努力一点点,技术变化看得见

文章目录

  • 环境变量基本概念
  • 查看环境变量的方法
  • 环境变量相关命令
  • 环境变量组织方式及获取环境变量的3种方法
  • 验证环境变量的全局属性


环境变量基本概念

环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
环境变量通常具有某些特殊用途,在系统当中通常具有全局特性

【示例1】我们在系统中执行ls命令时,不需要./ls。而我们执行自己编写的C语言程序,并将它编译成test时,我们要执行它就需要./test才能够运行,这是为什么呢?

which命令后带上某个命令,就可以查看该指令的存储位置。如果执行which ls,可以看到ls存储在/usr/bin/目录中。

系统中维护了一个PATH环境变量,系统可以帮助我们在PATH环境变量保存的各个路径中查找命令。我们可以使用echo $[环境变量名]来查看某个环境变量的值,此时我们执行echo $PATH,结果如下图所示。可以发现,PATH环境变量种保存着/usr/bin目录。
在这里插入图片描述
也就是说,只要我们执行某个命令,系统默认从PATH环境变量下的各个目录进行搜索,如果存在该命令的可执行文件,则执行,否则就会报错。

而我们自己写的程序并没有保存PATH环境变量指定的目录下时,无法不带./就执行(或者是使用绝对路径的方式)。我们可以通过将该程序移动到PATH环境变量保存的某个目录中,这样就可以不带./运行了。但这种方式会污染系统命令,因为我们的程序并没有经过大量测试,可能存在大量错误,不建议将自己写的命令放入PATH变量的各个目录中。

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

查看环境变量的方法

echo $[环境变量名]

在这里插入图片描述

下面我们来看一下常见的环境变量:
●PATH:指定命令的搜索路径
命令本质就是可执行文件,我们没有指定命令的可执行文件地址,但它会从PATH环境变量内的各个目录中查找该命令是否存在,存在则执行,不存在则报错。
在这里插入图片描述
●HOME:指定用户的主工作目录(即用户登陆到Linux系统中的默认目录)
当我以root用户身份登录时,我的HOME环境变量保存的是/root;但如果我以xiaoming用户身份登录时,我的HOME环境变量保存的/home/xiaoming。从这里可以发现,不同用户的HOME目录(也成为家目录)是不一样的。
在这里插入图片描述
●SHELL:当前Shell,它的值通常是/bin/bash
我们启动一个Linux命令行,本质就是执行一个bash程序。bash在执行用户程序、指令时,会fork子进程执行,即使子进程因程序问题而出错,也不会影响到bash的稳定运行,也就不会影响到用户的命令行使用了。
在这里插入图片描述

环境变量相关命令

  • echo:显示某个环境变量值(上面已经有介绍,这里不再赘述)

使用实例↓↓↓

echo $PWD

在这里插入图片描述

  • env:显示所有环境变量

使用实例↓↓↓

env

在这里插入图片描述

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

使用实例↓↓↓

export jammingpro=666

在这里插入图片描述
在这里插入图片描述
要注意的是,export设置的环境变量仅在当前会话有效,当我们将整个会话关闭,重新打开Linux命令行时,这个环境变量就会消失。

在系统中,每次启动bash时,该bash都会从系统的环境变量配置文件中读取环境变量信息,export仅仅修改了本次启动的bash的环境变量,一旦关闭重启后,原来设置的环境变量不再存在,新启动的bash会重新从系统的环境变量配置文件中读取环境变量信息

如果我们想设置持久化的环境变量,可以修改/etc/profile添加环境变量,例如:下图中新增了jammingpro=666的环境变量↓↓↓(这样设置后,以后启动Linux的任何bash命令行中都会存在该环境变量)
在这里插入图片描述

  • set:显示本地定义的shell变量和环境变量

使用实例↓↓↓

set

在这里插入图片描述

我们可以在bash命令行直接定义变量,例如:baymaxPro=999(不需要使用export)。而set显示的除了环境变量外,还显示了本地自定义的shell变量。
在这里插入图片描述
那本地定义的变量和当前bash的环境变量有什么区别呢?当我们创建子进程时,当前bash的环境变量会被子进程继承,也就是说,bash执行的程序都有和bash相同的环境变量;但本地定义的变量不会被子进程继承。

  • unset:清除环境变量
unset [待清除的环境变量名]

在这里插入图片描述
由上图可以发现,unset既可以清除环境变量,也可以清除本地自定义的Shell变量。

环境变量组织方式及获取环境变量的3种方法

每个进程都有一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
在这里插入图片描述
下面我们介绍3种可以从环境变量表获取环境变量的方法↓↓↓

  • getenv

在这里插入图片描述
使用getenv实现pwd命令↓↓↓

#include <stdio.h>
#include <stdlib.h>

int main()
{
	printf("%s\n", getenv("PWD"));
	return 0;
}

在这里插入图片描述

  • environ(第三方变量)

在这里插入图片描述
使用environ时,需要先对该变量进行声明,即extern char** environ。下面使用代码打印环境表种的所有内容↓↓↓

#include <stdio.h>

int main()
{
	extern char **environ;
	for(int i = 0; environ[i]; i++)
	{
		printf("[%d]->%s\n", i, environ[i]);
	}
	return 0;
}

在这里插入图片描述

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

  • main的env参数(命令行第三个参数)

我们在使用命令执行某些可执行程序时,bash会帮助给该程序传入3个参数↓↓↓
在这里插入图片描述

以ls命令为例,ls -a -l,它的命令行参数有3个,分别时ls、-a、-l,因此argv保存的就是{“ls”, “-a”, “-l”, NULL},而第三个参数就是bash传递给它的子进程的环境变量。

下面我们使用main的env参数打印所有环境变量↓↓↓

#include <stdio.h>

int main(int argc, char* argv[], char* env[])
{
	for(int i = 0; env[i]; i++)
	{
		printf("[%d]->%s\n", i, env[i]);
	}
	return 0;
}

在这里插入图片描述

下面我们自定义一个命令xm,该命令只允许用户带一个选项,如果带的选项是-a就输出"xiaoming say => you are nice!!“,带-b选项就输出"what are you doing now?”,用户选项输出与要求不符的提示用户如何使用该命令↓↓↓

#include <stdio.h>
#include <string.h>

void Usage()
{
	printf("\r\tYou are supposed to use -a or -b\n");
}

int main(int argc, char* argv[], char* env[])
{
	if(argc == 2 && strcmp("-a", argv[1]) == 0)
	{
		printf("xiaoming say => you are nice!!\n");
	}
	else if(argc == 2 && strcmp("-b", argv[1]) == 0)
	{
		printf("what are you doing now?\n");
	}
	else 
	{
		Usage();
	}
	return 0;
}

在这里插入图片描述

验证环境变量的全局属性

环境变量具有全局属性,可以被子进程继承下去。子进程的环境变量是从父进程继承来的,默认所有的环境变量都会被子进程继承。

编写一个程序proc,用于获取名为jammingpro的环境变量↓↓↓

#include <stdio.h>
#include <stdlib,h>

int main()
{
	printf("%s\n", getenv("jammingpro"));
	return 0;
}

当前bash中开始时没有名为jammingpro的环境变量,此时使用export jammingpro=666设置环境变量,再指向proc程序时,proc程序可以获得该环境变量。说明子进程可以继承父进程的环境变量。
在这里插入图片描述
如果我们此时unset名为jammingpro的变量,并定义名为jammingpro的shell自定义变量,此时执行proc程序时会发送段错误。说明子进程不能继承bash中的shell自定义变量。
在这里插入图片描述

🎈欢迎进入从浅学到熟知Linux专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

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

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

相关文章

链表中常见的使用方法逻辑整理

文章目录 1. 二叉树特点1.1 完全二叉树1.2 满二叉树 2. 二叉树创建2.1 通过先序序列带有叶子结点标识符创建二叉树2.2 通过层次遍历顺序创建二叉树2.3 通过 先序中序 创建二叉树2.4 通过 先序中序 创建二叉树2.5 通过 中序后序 创建二叉树 3. 二叉树遍历通用方法3.1 先序遍历(深…

【软考中级】软件设计师考点分布

文章目录 软考官网资格设置软考报考流程 【软件设计师】考点分布选择题考点分布案例题考点分布 软考官网 中国计算机技术职业资格网&#xff1a;https://www.ruankao.org.cn/ 官网报名平台&#xff1a;https://bm.ruankao.org.cn/sign/welcome 资格设置 计算机软件计算机网…

SSM整合配置案例

一、什么是SSM整合 SSM整合用到两个容器&#xff0c;web容器是root容器的子容器&#xff0c;父子容器关系。 为了方便编写&#xff0c;我们可以三层架构每层对应一个配置类&#xff0c;分别指定两个容器加载 Ioc如何初始化&#xff1f; 二、简单实现整合SSM &#xff08;一…

是的,本科毕业八年,我考研了

今天&#xff0c;是一篇纯分享文。 是的&#xff0c;本科毕业八年&#xff0c;我考研了。 停更10个月&#xff0c;历时296天&#xff0c;我考研上岸了。 小伙伴们&#xff0c;好久不见。 一 发今年第一篇文章的时候刚处理完后续事宜&#xff0c;就简单说了句&#xff0c;后台…

QThread的学习

锁住该线程直到下面的情况之一出现&#xff1a; (1)和该线程连接的对象已经执行完成&#xff08;例如&#xff1a;当它从run()中返回时&#xff09; 如果该线程已经结束&#xff0c;该函数将返回true。 如果该线程还没有开始&#xff0c;它也返回true。 (2)time毫秒已经过去。如…

Linux 内核学习(2) --- regulator 框架

目录 Regulator 介绍Regulator provider 注册struct regulator_descstruct regualtor_configDTS 配置和解析On BoardConfig 配置regulator_ops总结 Regulator Consumer 使用struct regulator 获取regulator 操作使用Multi Regulator 参考博客 Regulator 介绍 Regulator 指的是…

电子烟特效音语音方案选型-WTN6020-8S-E

随着科技的迅猛进步&#xff0c;电子烟行业亦在持续创新与突破&#xff0c;引领着全新的潮流。其中&#xff0c;电子烟产品所特有的吸烟声音特效播报功能&#xff0c;无疑成为了技术革新的璀璨亮点。这一设计巧妙地将吸烟的声效融入使用体验中&#xff0c;使得用户在吸电子烟时…

Javascript 斐波那契搜索-迭代与递归(Fibonacci Search)

给定一个大小为 n 的排序数组 arr[] 和要在其中搜索的元素 x。如果 x 存在于数组中&#xff0c;则返回 x 的索引&#xff0c;否则返回 -1。 例子&#xff1a; 输入&#xff1a; arr[] {2, 3, 4, 10, 40}, x 10输出&#xff1a; 3 元素 x 出现在索引 3 处。 输入&#xff1…

HarmonyOS开发实例:【app帐号管理】

应用帐号管理 介绍 本示例选择应用进行注册/登录&#xff0c;并设置帐号相关信息&#xff0c;简要说明应用帐号管理相关功能。效果图如下&#xff1a; 效果预览 使用说明参考鸿蒙文档&#xff1a;qr23.cn/AKFP8k点击或者转到。 1.首页面选择想要进入的应用&#xff0c;首次进…

【Redis】持久化

文章目录 一、RDB1.1、RDB的自动备份与手动备份1.1.1、自动备份1.1.2、手动备份 1.2、RDB优点1.3、RDB缺点1.4、RDB快照1.5、RDB优化配置项 二、AOF2.1、AOF工作流程2.2、AOF写回策略2.3、MP-AOF实现2.4、AOF优缺点2.5、AOF重写机制 三、RDBAOF混合持久化3.1、数据恢复顺序和加…

生产环境中秒杀接口并发量剧增与负载优化策略探讨

✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心哦&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 引言 1. 实施限流措施 1.1 令牌桶算法&#xff1a; 1.2 漏…

如何申请阿里云服务器学生优惠,入口在这呢!

阿里云学生服务器免费申请&#xff0c;之前是云翼计划学生服务器9元/月&#xff0c;现在是高校计划&#xff0c;学生服务器可以免费申请&#xff0c;先完成学生认证即可免费领取一台云服务器ECS&#xff0c;配置为2核2G、1M带宽、40G系统盘&#xff0c;在云服务器ECS实例过期之…

什么是队头阻塞以及如何解决

前言 通常我们提到队头阻塞&#xff0c;指的可能是TCP协议中的队头阻塞&#xff0c;但是HTTP1.1中也有一个类似TCP队头阻塞的问题&#xff0c;下面各自介绍一下。 TCP队头阻塞 队头阻塞&#xff08;head-of-line blocking&#xff09;发生在一个TCP分节丢失&#xff0c;导致…

ip地址切换器安卓版,保护隐私,自由上网

在移动互联网时代&#xff0c;随着智能手机和平板电脑的普及&#xff0c;移动设备的网络连接变得愈发重要。为了满足用户在不同网络环境下的需求&#xff0c;IP地址切换器安卓版应运而生。本文将以虎观代理为例&#xff0c;为您详细解析IP地址切换器安卓版的功能、应用以及其所…

26、链表-环形链表II

思路&#xff1a; 这道题就是判断链表中是否有环&#xff0c;首先使用集合肯定可以快速地解决&#xff0c;比如通过一个set集合遍历&#xff0c;如果遍历过程中有节点在set中已经存在那么说明存在环。返回这个节点即可 第二种方式就是通过快慢指针方式寻找环。如何做呢&#xf…

震惊!借助Coze白嫖GPT4-128k解决方案

震惊!某大佬借助Coze白嫖GPT4-128k解决方案 前言 此文章介绍如何免费使用GPT-4高级模型并拓展API功能 最近的 Coze 在国内开放了&#xff0c;可以免费使用大模型。但是和国外的有点区别&#xff0c;国外版本使用的chatgpt4&#xff0c;国内版本使用的是语雀大模型。 Coze是一…

《前端防坑》- JS基础 - 你觉得typeof nullValue === null 么?

问题 JS原始类型有6种Undefined, Null, Number, String, Boolean, Symbol共6种。 在对原始类型使用typeof进行判断时, typeof stringValue string typeof numberValue number 如果一个变量(nullValue)的值为null&#xff0c;那么typeof nullValue "?" const u …

图书推荐:用ChatGPT获取在线被动收入的8个方法

Universe S. The ChatGPT Money Mastery. Unlocking Online Income..for Dummies 2023 想要彻底革新您的收入模式吗&#xff1f;《用ChatGPT获取在线被动收入的8个方法》一书是您不可错过的指南。 在这个数字化飞速发展的时代&#xff0c;人工智能成为了开启成功之门的钥匙。…

2024年广东省网络系统管理样题第1套网络搭建部分

2024年广东省职业院校技能大赛样题1 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu5488233 网络系统管理赛项 模块A&#xff1a;网络…

操作系统(第四周 第二堂)

目录 回顾 进程运行 进程的创建 进程的工作 举例 进程的删除 举例1&#xff08;走到return 0结束&#xff09; 举例2&#xff08;利用exit&#xff08;1&#xff09;结束&#xff09; 进程通信 共享内存 生产者算法 消费者算法 消息传递 定义 算法实现 总结 回顾…