【Linux】进程周边005之环境变量

2023-12-18

???? 樊梓慕: 个人主页

???? 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》

???? 每一个不曾起舞的日子,都是对生命的辜负


目录

前言

1.环境变量是什么?

1.1查看环境变量的方法

1.2常见的环境变量

1.2.1PATH

1.2.2USER

1.2.3PWD

1.2.4HOME

2.环境变量的特性

2.1补充知识:命令行参数

2.1.1int argc与char* argv[]

2.1.2char* env[]

2.2环境变量如何具有全局属性?

3.环境变量的代码获取和设置

3.1代码获取环境变量

3.1.1通过main函数的第三个参数获取环境变量(不常用)

3.1.2通过getenv()函数获取环境变量(常用)

3.1.3通过第三方变量environ获取环境变量(不常用)

3.2设置环境变量

3.3本地变量的设置与查看

3.4unset取消环境变量或本地变量

4.环境变量的配置文件


前言

本篇文章博主将会与大家共同学习环境变量,那么环境变量究竟在扮演着什么样的角色呢?

为什么我们在编写C/C++代码时,不需要显式的告诉编译器我们所需要链接的动态静态库在哪,但链接照样可以成功并生成可执行程序,其实这里就是有环境变量的辅助。


欢迎大家???? 收藏 ????以便未来做题时可以快速找到思路,巧妙的方法可以事半功倍。

=========================================================================

GITEE相关代码: ???? fanfei_c的仓库 ????

=========================================================================


1.环境变量是什么?

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

下面带你认识几种环境变量来辅助你理解环境变量。

1.1查看环境变量的方法

实例:echo $NAME    //NAME:你的环境变量名称

实例:env    //显示所有环境变量

1.2常见的环境变量

1.2.1PATH

如何执行一个可执行程序?


可是为什么系统自带的命令(本质就是可执行程序)不需要带文件路径呢?

比如:

其实就是环境变量PATH的配置,我们查看一些PATH的内容:

我们发现pwd的路径就在PATH中,也就是说,可执行程序的路径如果在环境变量PATH中,那么就可以不需要带文件路径的执行了。

我们来试试:

你当然可以将你的可执行程序放到环境变量中的路径下,但是我并不推荐你这样做,因为你会污染你的系统目录,从而引发一些不必要的麻烦。

所以你可以这样做:修改环境变量。

注意 :如果你不慎覆盖了PATH,可以直接关闭XSHELL,因为你覆盖的PATH是加载到内存中的,重启XSHELL会重新读取磁盘中的文件,重新初始化PATH。

1.2.2USER

当我们执行whoami时,系统是如何知道当前用户是谁的,是因为有USER这个环境变量。

1.2.3PWD

当我们执行pwd时,系统是如何知道当前路径的,是因为有PWD这个环境变量。

1.2.4HOME

当我们访问家目录时,系统是如何知道家目录在哪的,是因为有HOME这个环境变量。

好了,举这些例子都是为了解释说明环境变量的概念。

定义变量的本质其实是开辟空间,所以系统的环境变量本质就是系统或bash开辟的一块内存空间,存放着名称和数据。


2.环境变量的特性

环境变量通常具有全局属性,可是为什么呢?

其实是因为环境变量会被子进程继承下去,所以环境变量才具有全局属性。

那么我们就来探究下这个继承的过程,但在开始前我们需要一点补充知识。


2.1补充知识:命令行参数

main函数有参数么?

之前学习C/C++时,我从未见过main函数有参数。

但实际上main函数拥有三个参数:

2.1.1int argc与char* argv[]

  • 第一个参数argc:表示argv数组中存放的字符指针个数
  • 第二个参数argv:存储的是相关的字符指针,指针指向的是一个个的字符串

那我们来打印一下试试,这两个形参是什么内容:

我们发现打印出来的好像是我们输入的命令啊。

所以我们来推测一下命令行解释器bash会干什么:

  1. printf("[ff@hecs-235417 test_23_12_09]$ ");
  2. char buffer[1024];
  3. scanf("%s",buffer);//fgets()
  4. 然后将输入进来的字符串传递给main函数的char* argv[],字符串数组的元素个数传递给int argc。

那我们再来写一段代码:

int main(int argc, char* argv[], char* env[])
{
    if (argc != 4)
    {
        printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n", argv[0]);
        return 1;
    }

    int x = atoi(argv[2]);
    int y = atoi(argv[3]);

    if (strcmp("-add", argv[1]) == 0)
    {
        printf("%d+%d=%d\n", x, y, x + y);
    }
    else if (strcmp("-sub", argv[1]) == 0)
    {
        printf("%d-%d=%d\n", x, y, x - y);
    }
    else if (strcmp("-mul", argv[1]) == 0)
    {
        printf("%d*%d=%d\n", x, y, x * y);
    }
    else
    {
        printf("unknown!\n");
    }
    return 0;
}

也就是说这两个参数就可以让我们通过不同的选项,使同一个程序执行它内部不同的功能。

这是不是就是我们平时使用的指令后面跟上不同的选项,执行内部不同的功能!?

命令行参数也是Linux指令选项的基础。


2.1.2char* env[]

同样的我们来打印看看该参数传递了什么?

int main(int argc, char* argv[], char* env[])
{
    printf("I am a process, pid: %d, ppid: %d\n", getpid(), getppid());
    for (int i = 0; env[i]; i++)
    {
        printf("env[%d] -> %s\n", i, env[i]);
    }
    return 0;
}

欸,这不是环境变量么!

也就是说main函数的第三个参数传递的是环境变量!


2.2环境变量如何具有全局属性?

上面介绍main函数的第三个参数char* env[]时,我们发现他传递的是环境变量,也就是说环境变量具有全局属性的方法就是通过子进程继承父进程的环境变量,而其传递所用的方式就是该参数。

比如:bash在创建子进程时会维护两张表,一张表为命令行参数字符串数组,另一张表为环境变量字符串数组,bash作为父进程会将这两张表传递给子进程,子进程通过main函数的第三个参数进行接收。


3.环境变量的代码获取和设置

3.1代码获取环境变量

3.1.1通过main函数的第三个参数获取环境变量(不常用)

首先第一种通过代码获取环境变量的方式就是利用main函数的第三个参数,前面已经讲过了,这里就不多赘述了。

3.1.2通过getenv()函数获取环境变量(常用)

int main()
{
    const char* username = getenv("USER");
    printf("username: %s\n", username);
    return 0;
}

那我们可以利用他来做点什么呢?

识别用户:

int main()
{
    const char* username = getenv("USER");
    if (strcmp(username, "ff") == 0 || strcmp(username, "fanzimu") == 0)
    {
        printf("this is my process core function\n");
    }
    else
    {
        printf("你没有权限\n");
    }
    return 0;
}

3.1.3通过第三方变量environ获取环境变量(不常用)

首先我们通过man指令来查看下environ

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

3.2设置环境变量

实例:export AGE=22

相当于给bash导出的环境变量,当执行myprocess后,bash是myprocess的父进程,所以myprocess继承了父进程的环境变量,所以该环境变量也就具有了全局属性。


3.3本地变量的设置与查看

注意:本地变量无法再env表中查到,且本地变量不会被子进程继承,不全局,只在bash中有效。

set命令:显示本地定义的变量和环境变量。

3.4unset取消环境变量或本地变量

实例:unset [变量名]


4.环境变量的配置文件

我们之前说环境变量是内存中的数据,我们每次在bash上修改环境变量,下次重登录的时候,所有环境变量会初始化,之前修改的内容就会被重新覆盖成最开始的内容,那很明显,这是因为环境变量是从磁盘中的某个文件中读取而来的。

环境变量的配置文件:.bash_profile

该配置文件在每个用户的家目录下。

如果我们对其内容进行修改:

下次重登录时,我们发现修改的环境变量被读取了:

讲完环境变量,你是否可以理解为什么我们每次登录默认所在的路径就是你自己的家目录呢?

那是因为每次登陆最开始系统需要读取你自己的环境变量配置文件!


=========================================================================

如果你对该系列文章有兴趣的话,欢迎持续关注博主动态,博主会持续输出优质内容

????博主很需要大家的支持,你的支持是我创作的不竭动力????

???? ~ 点赞收藏+关注 ~ ????

=========================================================================

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】进程周边005之环境变量 的相关文章

  • 将数组传递给函数名称冲突

    Specs GNU bash 版本 3 1 17 无法升级 Premise 我一直在摆弄数组 我想知道是否有任何方法可以让函数的本地变量与所述函数外部的数组同名 Example 在下面的示例中 我将尝试显示该问题 Working bin b
  • gethostbyname() 或 getnameinfo() 如何在后台工作?

    How gethostbyname or getnameinfo 在后台工作 include
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 伊迪德信息

    重新定义问题 有什么方法可以获取所连接显示器的序列号吗 我想收集显示器的Eid信息 当我使用 logverbose 选项运行 X 时 我可以从 xorg 0 log 文件中获取它 但问题是 如果我切换显示器 拔出当前显示器 然后插入另一个显
  • 无法安装 WWW::Curl::Easy: SZBALINT/WWW-Curl-4.17.tar.gz : make NO

    我正在尝试在我的 Fedora 26 机器上安装 WWW Curl Easy gcc c I usr include D REENTRANT D GNU SOURCE O2 g pipe Wall Werror format securit
  • 标准头文件中的 C 编译器错误 - 未定义的 C++ 定义

    我正在尝试编译 C 程序 但收到许多错误 这些错误是在标准 C 头文件 inttypes h stdio h stat h 等 中遇到的 错误的来源是以下未定义的常量 BEGIN DECLS END DECLS BEGIN NAMESPAC
  • 为 Qt 应用程序创建 Linux 安装

    我刚刚用 Qt Creator 制作了一个很棒的程序 我对自己很满意 如何将其从台式机移至笔记本电脑 那么 最好的方法是安装程序 对吗 对于 Ubuntu 这是一个 Debian 软件包 对吗 我怎么做 有人这样做过吗 他们可以分享 QT
  • Inotify linux 监视子目录

    是否可以以这种模式监视目录 storage data usernames Download gt storage data Download 我需要监视每个用户的下载文件夹中是否进行了更改 也许我需要创建所有路径的列表 将其放入数组中 并在
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然
  • QFileDialog::getSaveFileName 和默认的 selectedFilter

    我有 getSaveFileName 和一些过滤器 我希望当用户打开 保存 对话框时选择其中之一 Qt 文档说明如下 可以通过将 selectedFilter 设置为所需的值来选择默认过滤器 我尝试以下变体 QString selFilte
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 使用 find - 删除除任何一个之外的所有文件/目录(在 Linux 中)

    如果我们想删除我们使用的所有文件和目录 rm rf 但是 如果我希望一次性删除除一个特定文件之外的所有文件和目录怎么办 有什么命令可以做到这一点吗 rm rf 可以轻松地一次性删除 甚至可以删除我最喜欢的文件 目录 提前致谢 find ht
  • Android:ANT 构建失败,并显示 google-play-services-lib:“解析为没有项目的 project.properties 文件的路径”

    我正在尝试使用 ANT 构建我的应用程序 但在包含 google play services lib 库项目后 我惨遭失败 Step 1 我在 project properties 文件中设置了对库项目的引用 android library
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh

随机推荐

  • jQuery 的语法详解

    jQuery是一个流行的JavaScript库 它简化了JavaScript在网页开发中的操作 jQuery提供了一套简洁而强大的语法 使得操作HTML元素 处理事件 执行动画等变得更加容易 以下是一些常用的jQuery语法 选择器 Sel
  • 【网络安全】CTF入门教程(非常详细)从零基础入门到进阶,看这一篇就够了!

    一 CTF简介 CTF Capture The Flag 中文一般译作夺旗赛 在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCON全球黑客大会 以代替之前黑客们通过互相发起真实攻击进行技术
  • 【网络安全】CTF入门教程(非常详细)从零基础入门到进阶,看这一篇就够了!

    一 CTF简介 CTF Capture The Flag 中文一般译作夺旗赛 在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式 CTF起源于1996年DEFCON全球黑客大会 以代替之前黑客们通过互相发起真实攻击进行技术
  • ADB:实现双击效果

    命令 adb shell seq 2 while read i do input tap 993 814 input tap 993 814 sleep 0 01 done 但是 上述命令有时候变成两次点击 成功率大概80 左右把 没办法
  • SiLM5350MDBCA-DG车规级隔离驱动芯片,我们能为汽车智能提供什么?

    SiLM5350MDBCA DG是一款适用于IGBT MOSFET的单通道 隔离门极驱动器 具有10A拉电流和10A灌电流驱动能 力 提供内部钳位功能 可单独控制 上升时间和下降时间 在 SOP8 封 装 中 具 有 3000VRMS 隔
  • 网络安全日报 2023年12月18日

    1 伊朗OilRig组织部署3个新的恶意软件下载程序 https www welivesecurity com en eset research oilrig persistent attacks cloud service powered
  • 如何安装 Python

    1 打开浏览器 输入网址 www python org 2 根据电脑系统配置进行下载 3 确定电脑系统属性 此处我们以win10的64位操作系统为例 4 安装python 3 6 3 双击下载的安装包 python 3 6 3 exe 注意
  • 探索人工智能中的语言模型:原理、应用与未来发展

    导言 语言模型在人工智能领域中扮演着重要的角色 它不仅是自然语言处理的基础 也是许多智能系统的核心 本文将深入研究语言模型的原理 广泛应用以及未来发展趋势 1 语言模型的原理 统计语言模型 基于概率统计的传统语言模型 如N gram模型 神
  • Sublime Text 4 for Mac/win: 提升前端开发效率的编辑神器

    对于前端开发者来说 一个高效的代码编辑器是必不可少的工具 而Sublime Text 4作为一款著名的跨平台编辑器 不仅提供了丰富的功能 还能够极大地提升开发效率 首先 Sublime Text 4拥有强大的代码编辑功能 它支持多种编程语言
  • 企业电子招投标采购系统源码之鸿鹄电子招投标系统+电子招投标的组成

    招投标管理系统是一款适用于招标代理 政府采购 企业采购和工程交易等领域的企业级应用平台 该平台以项目为主线 从项目立项到项目归档 实现了全流程的高效沟通和协作 通过该平台 用户可以实时共享项目数据信息 实现规范化管理和有效监控 协同工作网络
  • 宝藏级Python入门基础教程完整版(非常详细),从入门到精通(懂中文就能学会)

    Python在近几年越来越受追捧 很多童鞋或者职场小伙伴想要提升技能 学习Python 这是非常好的事情 但问题在于很多人不知道学Python做什么 所以什么零碎细末 艰难晦涩 长篇大论的都去看 很容易陷入学不下去的困境 必须要有针对性 选
  • 鸿蒙大势将成,你还在等什么

    自从华为发布HarmonyOS 4系统后 宣布下一个鸿蒙版本将不再支持安卓应用 并启动鸿蒙原生应用 随后国内巨头纷纷响应 为鸿蒙系统开发原生应用 广汽传祺和酷派两大巨头的加入 进一步证明了鸿蒙系统的强大和广泛的应用前景 况且鸿蒙生态用户数量
  • 实现元素的淡入淡出效果

    jQuery Fading方法 通过jQuery 您可以实现元素的淡入淡出效果 jQuery拥有下面四种fade方法 fadeIn fadeOut fadeToggle fadeTo jQuery fadeIn 方法 jQuery fade
  • Macleod中双面镀膜的模拟

    传统意义上 Essential Macleod的设计是由一系列完全干涉的薄膜组成 并只在基板的一侧形成膜层 而Stack是由一组膜层和基板组成 基板的两个面是平行的 以便在相同材料中传播角度相同 Stack中 膜层被介质 或基底 分开 介质
  • 如何利用CHAT分析问题?

    问CHAT 项目能够顺利完成的因素有哪些 CHAT回复 1 明确的目标 项目需要有一个明确的目标 这样才能为团队提供一个清晰的方向 2 计划和组织 一个成功的项目必须经过详细的计划和组织 以确保所有的任务都能在预定的时间内完成 3 资源分配
  • mp3音频剪辑软件哪个好?把你的音乐剪出新意

    在一个阳光明媚的午后 你坐在咖啡馆的角落 听着轻快的爵士乐 突然间 一首熟悉的旋律在你的脑海中回荡 你决定要把这段旋律剪辑下来 留作纪念 那么 电脑如何剪辑音频呢 这就需要用到音频剪辑软件了 今天就为大家推荐三款非常实用的软件 如果你正好需
  • 干货下载丨不分业态、不关注核心需求,怎么做得好项目管理?!

    项目管理 装备制造业的破局利刃 对于装备制造行业而言 每一笔订单都是 非标定制 小批量制造 这种特性决定了其行业企业普遍存在 新品开发周期长 生产效率低 质量不稳定 交货期不稳定 成本预算难控制 非标品报价慢 等问题 如何提升企业的管理水平
  • 智能机器人:未来与现实的交汇

    导言 人工智能智能机器人是当今科技领域的璀璨明珠 将技术 感知和智能相结合 呈现出前所未有的发展态势 人工智能助力的智能机器人代表了科技融合的巅峰 其强大的感知 学习和决策能力正深刻改变着我们的生活 本文将深入探讨人工智能智能机器人的定义
  • 网信办新规“1小时上报”,赛宁网安积极响应!

    12月8日 国家互联网信息办公室起草发布了 网络安全事件报告管理办法 征求意见稿 以下简称 办法 办法 明确规定了运营者在发生网络安全事件时 应当及时启动应急预案进行处置 属于较大 重大或特别重大网络安全事件的 应当于1小时内进行报告 办法
  • 【Linux】进程周边005之环境变量

    樊梓慕 个人主页 个人专栏 C语言 数据结构 蓝桥杯试题 LeetCode刷题笔记 实训项目 C Linux 每一个不曾起舞的日子 都是对生命的辜负 目录 前言 1 环境变量是什么 1 1查看环境变量的方法