Linux环境变量

Linux环境变量

📟作者主页:慢热的陕西人

🌴专栏链接:Linux

📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言

本博客主要内容讲解了环境变量,什么是环境变量,为什么需要环境变量,以及main函数命令行参数

文章目录

  • Linux环境变量
    • 环境变量
      • 常见的环境变量:
      • 查看环境变量
      • 测试HOME
      • 和环境变量相关的命令
      • 环境变量的组织方式
      • 通过代码如何获取环境变量
      • 利用环境变量实现一个mypwd
      • 环境变量的小总结
    • 环境变量通常是具有全局属性的
    • 环境变量的意义
    • 拓展
      • Linux下一些奇怪的命令
    • main函数的命令行参数

首先我们通过一个小例子来进入环境变量的学习,我们知道我们运行我们自己编写的程序的时候,我们是./文件名的方式去运行的,但是我们运行系统自带的程序或指令却不需要加上./。这是为什么呢?

首先我们要明白.表示的是当前目录,所以./文件名的意思就是访问当前目录下的这个文件。

那么我们可不可以做到像运行系统中的指令那样去运行我们自己的文件呢?

答案是可以的,但是这牵扯到系统的环境变量,首先我们查看一下当前系统的环境变量:

image-20231104152232252

我们只需要一行指令就可以实现我们想要的结果:就是图中橙色框框中的命令,这个命令就是将我们的环境变量更改为我们当前的目录;

image-20231104152537479

但是似乎又出问题了当我们尝试使用系统自带的命令时,出问题了!

image-20231104153211752

那么这种情况因为我们时命令式的改变环境变量,这个时候我们重启Xshell即可!

那么我们如何去不影响系统本身的命令并且实现上面的效果呢?

①向环境变量中追加我们当前的目录:

image-20231104154846665

②我们把我们想要实现效果的文件放到我们已经存在在环境变中的一个目录下:

将这个文件拷贝到我们的默认目录下,这其实相当于我们的安装

然后将文件从我们的默认目录下删除的过程,相当于卸载

image-20231104155335539

这里所谓的PATH就是我们的环境变量:

环境变量

基本概念

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但
    是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见的环境变量:

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

查看环境变量

echo $NAME//NAME:当前你的环境变量的名称

测试HOME

1.用root和普通用户,分别执行 echo $HOME ,对比差异

image-20231105163205931

其中每个用户的~目录就是每个用户的家目录。

和环境变量相关的命令

1.echo: 显示某个环境变量值

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

3.env: 显示所有环境变量

4.unset: 清除环境变量

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

环境变量的组织方式

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

通过代码如何获取环境变量

  • 命令行第三个参数
  #include<stdio.h>                                       

  int main(int argc, char* argv[], char* envp[])    
  {                                                  
    int i;                               
    for(i = 0; envp[i]; ++i)    
    {                                       
      printf("envp[%d]--->%s\n",i,envp[i]);    
    }    
    return 0;    
  }  
  • 通过第三方变量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;
}

image-20231105171023137

利用环境变量实现一个mypwd

代码:

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

#define NAME "mi"      
//int main(int argc, char* argv[])      
int main()      
{      
 char* own = getenv("USER");      
 if(strcmp(own, NAME) == 0)      
 {      
   printf("这个程序已经执行啦.......\n");        
 }      
 else      
 {      
   printf("当前用户%s是一个非法用法,无法执行\n", own);    
 }  
return 0;
}

当我们使用普通用户mi来运行这个程序的时候结果是:

这个程序已经运行啦…

当我们切换到root的时候运行的结果就是:

当前用户root是一个非法用户,无法执行;

image-20231105173406705

这就是和我们每个用户所对应的环境变量有关!

环境变量的小总结

环境变量本质是一个内存级的一张表(这也是为什么我们在用命令修改了环境变量表重新链接之后又会还原了),这张表由用户在登录系统的时候,进行给特定用户形成属于自己的环境变量表。

环境变量中的每一个,都有自己的用途:有的是进行路径查找的,有的是进行身份认证的,有的时候是进行动态库查找的,有的是用来进行确认当前路径等等。

每一个环境变量都有自己的特定应用场景

每一个元素都是KV的。

那么环境变量对应的数据,都是从哪里来的呢?

系统的相关配置文件中读取出来的!

image-20231105173930190

环境变量通常是具有全局属性的

首先我们在bash下输入这样一条指令:

image-20231105180419628

我们发现bash似乎把我们这个变量myval存储起来了!好像跟环境变量有点关系,因为我们打印环境变量的时候就是echo $环境变量

但是我们在调用env去环境变量表里去查找这个变量的时候我们却找不到。

我们再试试另一种方法:加上export因为我们之前用这个命令向环境变量中添加过PATH

image-20231105180817527

这时候我们再次调用env指令去环境变量里去找一下,结果是我们找到了这个变量:

image-20231105181117251

接下来我们为了再次确认我们用程序帮我们在环境变量表里去寻找一下:

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

//#define NAME "mi"      
//int main(int argc, char* argv[])      
int main()      
{      
char* s = getenv("HELLO1");      
if(s != 0)    
{    
   printf("%s\n",s);    
}    
return 0;
}

我们发现结果是可以被找到的,但是我们并没有向main函数中传入环境变量,可是为什么它却可以找到?

image-20231105181711205

首先我们要理解main也是一个函数,我们通常把他叫做入口函数,其实环境变量不仅可以通过参数的形式传给我们的main函数,而且也可以通过父进程传给子进程的方式传给我们的main函数

所以我们可以得出以下结论:

  • 环境变量通常具有全局属性,可以被子进程继承下去

那么不加export的情况myval=1myval被称之为**本地变量**,对于本地变量,只在shell内部有效!

也就是说本地变量不可以被子进程继承!

那么为什么echo $myval可以打印出结果,echo也按理来说是一个子进程,为什么它可以打印出来?

原因是echo是一个**内建命令**。

环境变量的意义

当我们没有启动操作系统的时候,环境变量就在配置文件里,当我们启动操作系统的时候,特定的进程或者说bash 就会帮我们读取配置文件,帮我们把环境变量Load到bash内部,然后我们后面执行的所有子进程都和bash有关。因为环境变量是可以交给所有进程的,所以环境变量也可以影响所有进程的。包括我们的头文件查找,库文件查找,指令搜索等等。

拓展

Linux下一些奇怪的命令

.

​ 这个命令就一个.等价于source,他的意思是将.或者source后面所跟的配置文件立即生效!

image-20231105215048610

[

在Linux中,[命令通常用于条件测试。它用于检查文件的存在性、比较数字,以及检查字符串是否为空等。例如,如果你想检查一个文件是否存在,你可以使用[ -f /path/to/file ]。如果文件存在,这个命令将返回真(0),否则返回假(非0)。这个命令通常与if语句或while循环一起使用,以便根据条件执行特定的操作。

这是一个例子:

if [ -f /path/to/file ]
then
 echo "File exists."
else
 echo "File does not exist."
fi

在这个例子中,如果文件存在,脚本将打印"File exists.“,否则,它将打印"File does not exist.”。请注意,[]之间的空格是必需的。如果你忘记了这些空格,你可能会得到一个错误。

main函数的命令行参数

接下来我们写出一个示例代码:

首先main函数中的argc:表示的是参数的数量,argv:是一个char*类型的数组,存储的是这些参数。

#include<stdio.h>    
#include<string.h>    
#include<stdlib.h>    
void Usage(const char* name)    
{    
printf("\nUsage:%s -[a|b|c]\n", name);    
exit(0);                                                                                                          
}    
int main(int argc, char* argv[])    
{    
if(argc != 2) Usage(argv[0]);    

if(strcmp(argv[1],"-a")) printf("打印当前目录下的文件名\n");    
else if(strcmp(argv[1], "-b")) printf("打印当前目录下的文件的详细文件\n");    
else if(strcmp(argv[1], "-c")) printf("打印当前目录下的文件名(包括隐藏文件)\n");    

return 0;    
}  

image-20231106150142779

到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV检测圆(Python版本)

文章目录 示例代码示例结果调参 示例代码 import cv2 import numpy as np# 加载图像 image_path DistanceComparison/test_image/1.png image cv2.imread(image_path, cv2.IMREAD_COLOR)# 将图像转换为灰度 gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用高斯模糊消除…

Python采集数据代码示例

python import requests from bs4 import BeautifulSoup # 设置信息 proxy_host proxy_port proxy_url fhttp://{proxy_host}:{proxy_port} proxy {http: proxy_url, https: proxy_url} # 设置要爬取的网页链接 url # 使用requests发送GET请求&#xff0c;并设置代理…

[C/C++]数据结构 链表OJ题:移除链表元素

题目描述: 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 方法一: 从头开始遍历链表,当遇到相同元素则跳过该元素,指向下一节点 struct ListNode* removeElements(struct ListNode* head…

element tab组件,是否阻止切换

需求&#xff1a; 在tab切换之前判断当前页面是否有选择商品&#xff0c;如果有则在切换前提示用户保存 代码&#xff1a; <el-tabs v-model"tabActive" type"card" closable :before-leave"tabBefore" tab-remove"tabRemove">…

详解MES系统在质检管理中的多角度应用

MES系统的质检管理是指在制造过程中&#xff0c;利用MES系统的功能和工具来规划、执行和监控质检活动&#xff0c;以确保产品的质量符合预期标准和客户要求的管理过程。 1. 质检计划和标准制定&#xff1a; MES系统可以帮助企业制定质检计划&#xff0c;并定义质量标准和要求…

淘宝API商品详情接口丨关键词搜索接口丨用户评论接口丨淘宝销量接口

淘宝API商品详情接口&#xff0c;关键词搜索接口&#xff0c;用户评论接口&#xff0c;淘宝销量接口如下&#xff1a; 淘宝/天猫获得淘宝商品详情 API 返回值说明 item_get-获得淘宝商品详情 1.公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在…

Python 海龟绘图基础教学教案(十六)

Python 海龟绘图——第 32 题 题目&#xff1a;绘制下面的图形 解析&#xff1a; 循环绘制长方形里面一个小正方形 答案&#xff1a; import turtle as t for i in range(0,2): t.fd(140) t.lt(90) t.fd(80) t.lt(90) t.pu() t.fd(50) t.lt(90) t.fd(20) t.pd()for i…

Chatgpt人工智能对话源码系统分享 带完整搭建教程

ChatGPT的开发基于大规模预训练模型技术。预训练模型是一种在大量文本数据上进行训练的模型&#xff0c;可以学习到各种语言模式和知识。在ChatGPT中&#xff0c;预训练模型被用于学习如何生成文本&#xff0c;并且可以用于各种不同的任务&#xff0c;如对话生成、问答、摘要等…

不一样的编程方式 —— 协程(设计原理与汇编实现)

主要通过以下9个方面来了解协程的原理&#xff1a; 目录 1、为什么使用协程 1.3、协程的适用场景 2、协程的原语操作 3、协程的切换 3.1、汇编实现 4.协程的运行流程 5.协程的结构体定义(我们其实可以参照线程或者进程的状态来设计) 5.1、多状态集合设计 6.协程的调度…

正点原子嵌入式linux驱动开发——Linux 网络设备驱动

网络驱动是linux里面驱动三巨头之一&#xff0c;linux下的网络功能非常强大&#xff0c;嵌入式linux中也常常用到网络功能。前面已经讲过了字符设备驱动和块设备驱动&#xff0c;本章就来学习一下linux里面的网络设备驱动。 嵌入式网络简介 嵌入式下的网络硬件接口 本次笔记…

论文阅读—— CEASC(cvpr2023)

arxiv&#xff1a;https://arxiv.org/abs/2303.14488 github&#xff1a;https://github.com/Cuogeihong/CEASC 为了进一步减轻SC中的信息损失&#xff0c;使训练过程更加稳定&#xff0c;我们在训练过程中除了稀疏卷积之外&#xff0c;还保持了正常的密集卷积&#xff0c;生成…

GaussDB SQL基础语法-变量常量

目录 一、前言 二、GaussDB数据库中的常量和变量的基本概述及语法定义 1、变量定义 2、常量定义 3、其他&#xff08;%TYPE、%ROWTYPE属性&#xff09; 三、在GaussDB数据库中如何使用变量&常量&#xff08;示例&#xff09; 示例一&#xff0c;定义常量&变量&a…

【计算机网络】网络层IP协议

文章目录 1. IP协议介绍2. IP报头3. IP的分片和组装4. IP地址网段划分特殊的IP地址子网、局域网、网段的区别IP地址的数量限制 5. 公网IP和私有IP6. NAT技术7. 路由Route 1. IP协议介绍 IP协议&#xff08;Internet Protocol&#xff09;是一种最常用的网络层协议&#xff0c;…

echarts 类目轴设置xAxis.interval不起效果

情景&#xff1a;在xAxis.typecategory&#xff1b;设置xAxis.interval不起效果&#xff1b; 解决方案&#xff1a;通过设置xAxis.axisLabel.interval属性

3.JMeter高级使用-让你与众不同

目录 概述插件下载与安装插件下载配置插件 服务器硬件资源监控(精简版)配置服务端代理JMeter配置监控CPU 监控网络 JMeter下载结束 概述 今日目标&#xff1a; 插件下载与安装Basic Graphs 主要点 Average Response Time 平均响应时间Active Threads 活动线程数Successful/Fa…

CVE-2023-34040 Kafka 反序列化RCE

漏洞描述 Spring Kafka 是 Spring Framework 生态系统中的一个模块&#xff0c;用于简化在 Spring 应用程序中集成 Apache Kafka 的过程&#xff0c;记录 (record) 指 Kafka 消息中的一条记录。 受影响版本中默认未对记录配置 ErrorHandlingDeserializer&#xff0c;当用户将容…

学习笔记|秩相关分析|Spearman相关分析|Kendall相关分析|规范表达|《小白爱上SPSS》课程:SPSS第十九讲:秩相关分析怎么做?

目录 学习目的软件版本原始文档秩相关分析一、实战案例二、统计策略三、SPSS操作四、结果解读五、规范表达1、规范图表2、规范文字 六、划重点&#xff1a; 学习目的 SPSS第十九讲&#xff1a;秩相关分析怎么做&#xff1f; 软件版本 IBM SPSS Statistics 26。 原始文档 《…

开发记录【1】

给列表加上序号 实现&#xff1a;Oracle有自带序号rownum,加上这个字段即可 【开发细节1】更新人可通过共享组件获取 【开发细节2】存入部门ID&#xff0c;想让其展示部门名&#xff0c;使用了共享组件&#xff0c;但是没显示&#xff0c;这是为什么呢&#xff1f; 【原因及解…

技术分享 | Frida 实现 Hook 功能的强大能力

Frida 通过 C 语言将 QuickJS 注入到目标进程中&#xff0c;获取完整的内存操作权限&#xff0c;达到在程序运行时实时地插入额外代码和数据的目的。官方将调用代码封装为 python 库&#xff0c;当然你也可以直接通过其他的语言调用 Frida 中的 C 语言代码进行操作。 Frida安装…

AI生图王者之战!深度体验实测,谁是真正的艺术家?

10月11日凌晨&#xff0c;设计软件巨头Adobe宣布推出一系列图像生成模型&#xff0c;其中Firefly Image 2作为新一代图像生成器&#xff0c;通过改善皮肤、头发、眼睛、手和身体结构增强了人体渲染质量&#xff0c;提供更好的色彩和改进的动态范围&#xff0c;并为用户提供更大…