【Linux】深度解剖环境变量

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟悉并掌握Linux的环境变量。

> 毒鸡汤:不为模糊不清的未来过分担忧,只为清清楚楚的现在奋发图强。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言

        咱们先抛出问题,不知道大家还记得我们使用java时需要安装环境变量,这里的环境变量就是我们今天所谈的环境变量,其实我们使用APP都需要配置环境变量,有些是不需要配置的,因为这些软件自己会配置环境变量,像我们使用的java编辑器就需要配置环境变量。基于这些情况我们来谈谈Linux下的环境变量。

⭐主体

我们从以下学习【Linux】深度解剖环境变量🥰🥰。

🌙浅谈基本概念

        环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景预先在系统内预先设置的一大批全局变量。

        例如,我们编写的C/C++代码,在各个目标文件进行链接的时候,从来不知道我们所链接的动静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。选取:<Linux>环境变量_linux 环境变量-CSDN博客

环境变量通常具有某些特殊用途,并且在系统当中通常具有全局特性。

要执行一个程序,那就需要先找到这个程序,如何去找是个问题🤔🤔,这里提供两个方案:

  • 第一种方法(把文件拷贝到系统的默认路径下)
  1. 缺陷:指令没有经过测试,把代码安装在系统里,会污染系统指令池。
  2. 这种方法是能够找到,因为系统有环境变量🫢🫢:

比如在编写代码的时候,在链接的时候,我们不知道所链接的动态静态库在哪里,但是可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

使用PATH查看:

  • 第二种方法(把当前的路径添加到环境变量里面)

指令如下:

export PATH=$PATH:加上路径

windows下的环境变量的查看,比如之前配置的jdk的环境变量:

🌙常见环境变量

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • LOGNAME:当前登录的用户名
  • HOSTNAME:主机名
  • SHELL : 当前Shell,它的值通常是/bin/bash

指令查看:

🌙获取环境变量

除去指令去获取环境变量,那我们就可以通过getenv获取环境变量🤗🤗。

1.创建文件mycmd.c和makefile

mycmd.c代码:

#include <stdio.h>
#include <stdlib.h>#define USER "USER"int main()
{char *who = getenv(USER);printf("user:%s\n",who);return 0;
}

makefile代码:

mycmd:mycmd.cgcc -o mycmd mycmd.c.PHONY:cleanclean:rm -f mycmd.c

2.运行结果

3.总结

USER环境变量最大的意义就是可以标识当前使用Linux用户


我们可以也可以使用strcmp直接去判断是否为root用户

mycmd.c代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define USER "USER"int main()
{char *who = getenv(USER);if(strcmp(who,"root") == 0){printf("user:%s\n",who);}else{printf("权限不足!\n");}return 0;
}

运行结果1:

运行结果2:

总结:

执行指令的时候,通过访问任何文件,文件上面有对应的拥有者和所属组,会根据环境变量user去进行对应,对身份进行认证,环境变量会在不同的应用场景被使用。

🌙设置环境变量

  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量
  • set: 显示本地定义的shell变量和环境变量

echo:

env查环境变量并没有结果,要想找到结果,我们可以用export

export:

mycmd.c代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define USER "USER"
#define MY_ENV "myval"int main()
{char *who = getenv(USER);if(NULL == myval){printf("%s not found\n",MY_ENV);return 1;}printf("%s = %s\n",MY_ENV,myval);return 0;
}

这时候用到export,把本地变量导成环境变量。

set:

set可以显示本地定义的shell变量和环境变量

unset:

清除取消我们的环境变量


抛出问题:我们的系统为什么知道我们当前的路径在哪里:如一开始学的ls,加上文件名就可以了,不需要加上路径,那ls为什么知道当前的路径是在哪里?PWD

环境变量在bash中维护当前所处的路径,路径发生变化时,shell会调整环境变量的值,而运行ls是在创建子进程,而环境变量会被子进程继承,所以ls拿到了当前路径,所以ls不需要带上路径

🌙命令行参数

抛出问题:main函数可以带参数吗?最多可以带多少?

  • main函数也是存在参数的(最多有三个)
  • main函数也会被系统调用。

下面我们先来看看这三个参数:

int main(int argc, char* argv[], char* envp[])
{return 0;
}
  • int argc:数组里的元素个数
  • char argv[ ]:指针数组*
  • char*envp[] :环境变量

这个我们先演示前两个参数:

myproc.c代码:

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

运行结果:

总结:

我们给main函数传递的argc,char* argv[ ]是命令行参数,传递的内容是命令行中输入的程序名和选项,并且结尾以NULL束!!!


演示第三个参数:

char*envp[] 就是环境变量。也是一个字符指针数组,前面的argv是指向的命令行参数字符串,而这里envp指向的是一个一个环境变量字符串,最后也是以NULL结尾。结构图如下:

代码如下:

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

运行结果:

  • 总结:一个进程是会被传入环境变量参数的。
  • 补充:一个函数在声明和定义的时候都没有参数,那么我实际传参的时候可以传参。

🌙代码获取环境变量

  • 命令行第三个参数(char*env[])获取环境变量

代码如下:

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

运行结果:

  • 通过第三方变量environ获取 (extern char**environ)

代码如下:

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

运行结果:

  🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

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

相关文章

AIGC开发:调用openai的API接口实现简单机器人

简介 开始进行最简单的使用&#xff1a;通过API调用openai的模型能力 OpenAI的能力如下图&#xff1a; 文本生成模型 OpenAI 的文本生成模型&#xff08;通常称为生成式预训练 Transformer 或大型语言模型&#xff09;经过训练可以理解自然语言、代码和图像。这些模型提供文…

神经网络 —— 模拟人脑的计算方式

神经网络能够反映人类大脑的行为&#xff0c;允许计算机程序识别模式&#xff0c;以及解决人工智能、机器学习和深度学习领域的常见问题。 人类发明的灵感来源有很多都是来自大自然&#xff0c;神经网络同样如此。人工神经网络是一种类似于人类神经网络的信息处理技术。但事实上…

------- 计算机网络基础

1.1概述 是什么? 答出独立计算机通信线路连接实现资源共享 计算机网络组成 从组成部分看: 硬件软件协议 从工作方式看: 边缘部分和核心部分 从功能组成看: 通信子网和资源子网 计算机网络性能指标 速率是指数据传输的物理速度&#xff0c;吞吐量是指实际的数据传输…

蜘蛛目标检测数据集VOC格式3900张

蜘蛛是一类广泛分布于地球各地的节肢动物&#xff0c;它们属于蛛形纲动物&#xff0c;是无脊椎动物的一个大类。蜘蛛的身体通常分为两个部分&#xff0c;头胸部和腹部&#xff0c;与其他节肢动物相比&#xff0c;蜘蛛的身体相对较小。 蜘蛛具有典型的八只腿&#xff0c;它们的…

jdk与cglib动态代理及原理

Spring的AOP在运行时多以jdk及cglib动态代理来实现。&#xff08;作者jdk是1.8版本&#xff09; 1 jdk 动态代理 Java中使用动态代理&#xff0c;只能对接口进行代理&#xff0c;不能对普通类进行代理。主要是由一个类及一个接口来实现&#xff1a; InvocationHandler&#…

Can‘t locate IPC/Cmd.pm in @INC (@INC contains:解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

AWTK 开源串口屏开发(4) - 采用数据

AWTK 开源串口屏开发 - 数据采集 1. 功能 数据采集是一个常用的功能&#xff0c;MCU 定时采集数据&#xff08;如环保设备定时采样空气中的污染物&#xff09;&#xff0c;并发送采样数据到串口屏&#xff0c;串口屏可以显示采样数据&#xff0c;也可以对采样数据进行管理&am…

实时数仓应用价值(下)

欢迎关注WX公众号&#xff1a;数据运营入表资产化服务 获取更多算法源码材料 2023数据资源入表白皮书&#xff0c;推荐系统源码下载-CSDN博客 浅析研发支出费用化和资本化的区别-CSDN博客 商业银行数据资产估值白皮书&#xff0c;推荐系统源码下载-CSDN博客 用友BIP数据资…

Visual Studio 配置DLL

我们在用Visual Studio进行开发时&#xff0c;如果没有正确配置DLL&#xff0c;就会出现类似“丢失***.dll”的错误。DLL配置有哪些方法&#xff1f; 1、手动复制 将dll文件拷贝到生成的.exe所在的文件夹里 2、配置环境 在右键属性->配置属性->调试->环境&#xf…

分布式技术之分布式消息队列通信

文章目录 什么是消息队列&#xff1f;消息队列的原理消息队列工作原理RocketMQ 消息队列原理及工作机制 什么是消息队列&#xff1f; 队列是一种具有先进先出特点的数据结构&#xff0c;消息队列是基于队列实现的&#xff0c;存储具有特定格式的消息数据&#xff0c;比如定义一…

scanf函数返回值被忽略

心怀希望的前进 前言 最近在复习c语言&#xff0c;发现了许多之前不了解的知识&#xff0c;今天想来与大家分享一下scanf返回值值被忽略的问题。 很多人应该都在vs中见到过&#xff0c;我们先说原因&#xff0c;再说改进方法 原因&#xff1a; scanf函数在读取数据时不会检…

【Week-P3】CNN天气识别

文章目录 一、环境配置二、准备数据三、搭建网络结构四、开始训练五、查看训练结果六、总结6.1 不改变学习率的前提下&#xff0c;将训练epoch分别增加到50、60、70、80、90&#xff08;1&#xff09;epoch 50 的训练情况如下&#xff1a;&#xff08;2&#xff09;epoch 60 …