【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.mzph.cn/news/585367.shtml

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

相关文章

LeetCode刷题--- 单词搜索

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 ​​​​​​http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述…

LLM之RAG实战(十一)| 使用Mistral-7B和Langchain搭建基于PDF文件的聊天机器人

在本文中&#xff0c;使用LangChain、HuggingFaceEmbeddings和HuggingFace的Mistral-7B LLM创建一个简单的Python程序&#xff0c;可以从任何pdf文件中回答问题。 一、LangChain简介 LangChain是一个在语言模型之上开发上下文感知应用程序的框架。LangChain使用带prompt和few-…

CENTOS docker拉取私服镜像

概述 docker的应用越来越多&#xff0c;安装部署越来越方便&#xff0c;批量自动化的镜像生成和发布都需要docker镜像的拉取。 centos6版本太老&#xff0c;docker的使用过程中问题较多&#xff0c;centos7相对简单容易。 本文档主要介绍centos系统安装docker和拉取docker私…

一文了解无线通信 - NB-IOT、LoRa

NB-IOT、LoRa 目录概述需求&#xff1a; 设计思路实现思路分析 NB-IOT1.LoRa2.区别 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for change,chall…

简单了解SQL堆叠注入与二次注入(基于sqllabs演示)

1、堆叠注入 使用分号 ; 成堆的执行sql语句 以sqllabs-less-38为例 ?id1 简单测试发现闭合点为单引号 ?id1 order by 3 ?id1 order by 4使用order by探测发现只有三列&#xff08;字段数&#xff09; 尝试简单的联合注入查询 ?id-1 union select 1,database(),user()-…

开放网络+私有云=?星融元的私有云承载网络解决方案实例

在全世界范围内的云服务市场上&#xff0c;开放网络一直是一个备受关注的话题。相比于传统供应商的网络设备&#xff0c;开放网络具备软硬件解耦、云原生、可选组件丰富等优势&#xff0c;对云服务商和超大型企业有足够的吸引力。 SONiC作为开源的网络操作系统&#xff0c;使得…

uni-app uni-app内置组件

锋哥原创的uni-app视频教程&#xff1a; 2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版)&#xff0c;火爆更新中...共计23条视频&#xff0c;包括&#xff1a;第1讲 uni…

【JS笔记】JavaScript语法 《基础+重点》 知识内容,快速上手(二)

数组 什么是数组&#xff1f; 字面理解就是 数字的组合 其实不太准确&#xff0c;准确的来说数组是一个 数据的集合 也就是我们把一些数据放在一个盒子里面&#xff0c;按照顺序排好 [1, 2, 3, hello, true, false]这个东西就是一个数组&#xff0c;存储着一些数据的集合 …

python测试工具: 实现数据源自动核对

测试业务需要&#xff1a; 现有A系统作为下游数据系统&#xff0c;上游系统有A1,A2,A3... 需要将A1,A2,A3...的数据达到某条件后&#xff08;比如&#xff1a;A1系统销售单提交出库成功&#xff09;自动触发MQ然后再经过数据清洗落到A系统&#xff0c;并将清洗后数据通过特定…

css 用多个阴影做出光斑投影的效果 box-shadow

css 用多个阴影做出光斑投影的效果 box-shadow 你首先需要知道的一点是 box-shadow 可以接收多个值&#xff0c;也就是可以设置多个阴影&#xff0c;这样就可以做一个类似光斑投影的效果。 一、效果 二、代码 里面用到了我一些 scss 工具方法&#xff0c;不过不影响&#xf…

Linux升级指南:保持系统安全和高效运行

Linux系统的升级是确保系统稳定和安全性的重要步骤。本文将介绍Linux系统升级的基本概念&#xff0c;以及具体的操作步骤和注意事项&#xff0c;以帮助用户顺利升级他们的Linux系统。 Linux操作系统以其稳定性和可定制性而闻名&#xff0c;它经常通过升级来提供新的功能、修复漏…

秒杀系统的设计思路(应对高并发,超卖等问题的解决思路)

首先我们先看一下设计秒杀系统时&#xff0c;我们应该考虑的问题。 解决方案&#xff1a; 一.页面静态化结合CDN内容分发 前端把能提前放入cdn服务器的东西都放进去&#xff0c;反正把所有能提升效率的步骤都做一下&#xff0c;减少真正秒杀时候服务器的压力。 秒杀活动的页面…

九州金榜|家庭教育中如何培养优秀的孩子

家庭是孩子心中最大的底气&#xff0c;而家庭的形态也就构成孩子未来的模样。所以给为孩子提供最好的教育&#xff0c;就是为孩子创建一个学习气氛浓厚&#xff0c;成员关系美满的家庭&#xff0c;它会成孩子成长道路上最大的助力&#xff0c;最温暖的港湾。 北京大学校长蔡元培…

Windows Sockets 2 笔记

文章目录 一、Winsock简介二、Windows中Winsock对网络协议支持的情况三、使用Winsock3.1 关于服务器和客户端3.2 创建基本Winsock应用程序3.3 初始化Winscok3.3.1 初始化步骤3.3.2 初始化的核心代码3.3.3 WSAStartup函数的协调3.3.4 WSACleanup函数3.3.5 初始化的完整代码 3.4 …

Spring Boot学习随笔- 集成MyBatis-Plus,第一个MP程序(环境搭建、@TableName、@TableId、@TableField示例)

学习视频&#xff1a;【编程不良人】Mybatis-Plus整合SpringBoot实战教程,提高的你开发效率,后端人员必备! 引言 MyBatis-Plus是一个基于MyBatis的增强工具&#xff0c;旨在简化开发&#xff0c;提高效率。它扩展了MyBatis的功能&#xff0c;提供了许多实用的特性&#xff0c;…

Visual Studio 配置DLL

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

Linux之定时任务调度

crond crond是Linux系统中的一个守护进程&#xff0c;主要用于周期性地执行某种任务或等待处理某些事件。而crondtab是配套的工作&#xff0c;用于定时任务的设置。 语法 crontab [选项]常用选项 入门案例 执行crontab -e命令输入任务到调度文件中 */1 * * * * ls -l /et…

鸿蒙原生应用再添新丁!爱奇艺入局鸿蒙

鸿蒙原生应用再添新丁&#xff01;爱奇艺 入局鸿蒙 来自 HarmonyOS 微博12月29日消息&#xff0c;#爱奇艺完成鸿蒙原生应用Beta版#作为中国头部在线视频平台&#xff0c;爱奇艺 完成鸿蒙原生应用Beta版&#xff0c;将以丰富的正版高清视频资源促进鸿蒙生态的进一步繁荣&#x…

准备用vscode代替sourceinsight

vscode版本1.85.1 有的符号&#xff0c;sourceinsight解析不到。 看网上说vscode内置了ripgrep&#xff0c;但ctrlshiftf在文件里查找的时候&#xff0c;速度特别慢&#xff0c;根本不像ripgrep的速度。ripgrep的速度是很快的。 但今天再查询&#xff0c;速度又很快了&#x…

SparkStreaming_window_sparksql_reids

1.5 window 滚动窗口滑动窗口 window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持&#xff0c;从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据&#xff0c;会被聚合起来执行计算操作&#xff0c;然后生成的RDD&#xff0c;会…