linux系统的环境变量-搞清环境变量到底是什么

环境变量

  • 引例
  • 环境变量
    • 常见的环境变量
    • echo
    • export
    • env
    • unset
    • set
  • 通过代码获取环境变量
    • 使用第三个参数获取
    • 使用全局变量enviorn获取环境变量
    • 通过系统调用获取环境变量
  • 环境变量具有全局属性
  • main函数前两个参数的作用

引例

在linux系统中,我们使用ls命令,直接在命令行中输入ls。即可列出当前目录内容。我们可以在/usr/bin/目录下找到ls的可执行文件。如下图:

在这里插入图片描述

看一看下面这种情况:
在这里插入图片描述
为什么上面两个"不同"命令实现的功能一样呢?
原因就是环境变量搞的鬼!因为我们平常输入的ls本质上其实就是该目录下的可执行文件。我们输入ls时,命令行通过“环境变量里的路径”自动帮我们找到了该文件!

为了验证这种情况?我们查看以下当前的环境变量:

echo $PATH

在这里插入图片描述
可以看到当前环境变量里面有==/usr/bin/==该路径,我们输入ls时,自动会根据路径去找相关可执行文件。

环境变量

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

常见的环境变量

  • PATH:指定命令的搜索路径
  • HOME:指定用户的主工作目录
  • SHELL:当前Shell,通常是/bin/bash

echo

查看环境变量
echo $环境变量名

如下例子:

echo $PATH && echo $HOME
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

export

修改环境变量
用法:export PATH=
相当于赋值操作,使用:分割开。

示例:

export PATH=$PATH:/home/xty/cplusplus/linux/1027
解释:将PATH修改为$PATH(原来的环境变量)+自己新设置的路径。(注意路径中不能有. 否则会当成当前路径)

在这里插入图片描述

而该路径下有一个可执行文件,即我们自己写的c语言文件。

在这里插入图片描述
以前我们需要如上面执行自己的文件,而现在我们不需要这样了。
见证奇迹的时刻!如下所示:
在这里插入图片描述
我们仅仅输入文件名即可运行该程序,这就是环境变量的作用!

env

显示所有环境变量

unset

删除变量或函数
unset [-选项] 名字
f:函数
v:变量
在这里插入图片描述

set

显示本地定义的shell变量和环境变量。

通过代码获取环境变量

 int main(int argv, char** argv[], char *env[])

第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv
第三个参数:储存着系统的环境变量。

使用第三个参数获取

    1 #include<stdio.h>
    2 
    3  //通过第三个参数获取环境变量。
    4 int main(int argc, char *argv[], char *env[])                                                                                                                         
    5 {
    6   printf("begin.............\n");
    7 
    8   int i;
    9   for(i = 0; env[i]; i++)
   10   {
   11     printf("env[%d]:%s\n",i,env[i]); // 打印环境变量
   12   }
   13 
   14   printf("end.................\n");
   15 
   16 
   17 
   18   return 0;
   19 }

使用全局变量enviorn获取环境变量

在这里插入图片描述
如上图,这些环境变量存在environ中,存的是指向环境变量的指针。
示例:使用全局变量也可以获得环境变量。

    1 #include<stdio.h>
    4 int main(int argc, char *argv[])                                                                                                                                      
    5 {
    6   printf("begin.............\n");
    7 
    8   extern char **environ;//声明全局变量
    9   int i = 0;
   10   for(; environ[i];i++)
   11   {
   12     printf("%s\n",environ[i]);
   13   }      

通过系统调用获取环境变量

系统调用函数
getenv(环境变量名称)

运行示例:

    1 #include<stdio.h>
    2 #include<stdlib.h>
    4 int main(int argc, char *argv[])
    5 {
    6 
    7   printf("%s\n",getenv("PATH"));
    8   printf("%s\n",getenv("HOME"));                                                                                                                                      
    9 	return 0;
   10 }
  
  //输出结果
  /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/xty/.local/bin:/home/xty/bin
/home/xty

环境变量具有全局属性

  • 子进程可以继承父进程的父进程的环境变量。
    例子:为什么我们能通过char *env[],获取环境变量?
    因为我们写的test程序是由父进程(bash)创建的,那些环境变量都是父进程(bash)的,子进程给继承过来了,表面上我们什么都没传,实际上父进程给我们自动传过来了。

  • 环境变量具有全局属性。
    通过export设置的环境变量都具有全局属性。
    看一下代码:

    1 #include<stdio.h>
    2 #include<stdlib.h>
    4 int main(int argc, char *argv[])
    5 {
    6 
    7   printf("%s\n",getenv("XTYY")); //获取XTYY环境变量
    8 
    9   printf("\n");                                                                                                                                                       
   10 }

起初我没有设置XTYY环境变量,我们什么也没有得到。后来我通过export设置后,再次运行程序,发现获得了环境变量。因此可以证明环境变量具有全局属性。
在这里插入图片描述

main函数前两个参数的作用

 int main(int argv, char** argv[])

第一个参数:代表传入命令行参数的个数。
第二个参数:存储着指向命令行参数的指针。大小为argv

有一段示例程序可以解释这些参数的作用,
示例一:

  1 #include<stdio.h>
  2 #include<string.h>
  3 #include<stdlib.h>
  4 #include<unistd.h>
  5 
  6 
  7 
  8 int main(int argc, char *argv[])
  9 {
 10   if(argc != 2)
 11   {
 12     printf("Usage: %s 至少要有一个选项\n", argv[0]);
 13     return 1;
 14   }
 15 
 16   if(strcmp("-a", argv[1]) == 0)
 17   {
 18     printf("这是功能一\n");
 19   }
 20   else if(strcmp("-b", argv[1]) == 0)
 21   {
 22     printf("这是功能二");
 23   }
 24 
 25   return 0;                                                                                                                                                             
 26 }
 27 

在这里插入图片描述
通过上面的例子我们可以看出,执行程序后,命令行的选项,被存到了argv的数组中,从而实现不同功能的作用。

示例二:

  8 int main(int argc, char *argv[])
  9 {
 10   printf("argc = %d\n",argc);
 11 
 12   int i = 0;
 13   for(; i<argc; i++)
 14   {
 15     printf("%s ",argv[i]);
 16   }
 17   printf("\n");                                                                                                                                                         
 18 }

在这里插入图片描述

可以看出,argc代表着选项的数量;argv[0],代表命令;其余代表选项。

以上就是环境变量相关知识,后续还会继续补充,请期待。

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

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

相关文章

重磅消息!优维发布全新产品“应急管理”

近日&#xff0c;蚂蚁集团旗下的在线文档编辑与协同工具语雀平台发生了一次严重的宕机事件&#xff0c;导致用户无法正常使用其各项功能。从故障发生到完全恢复正常&#xff0c;语雀整个宕机时间将近 8 小时&#xff0c;如此长时间的宕机已经达到了 P0 级事故&#xff0c;并在网…

YugaByteDB -- 全新的 “PostgreSQL“ 存储层

文章目录 0 背景1 架构1.1 Master1.2 TServer1.3 Tablet 2 读写链路2.1 DDL2.2 DML2.3 事务 3 KEY 的设计4 Rocksdb 在 YB 中的一些实践总结 0 背景 YugaByteDB 的诞生也是抓住了 spanner 推行的NewSQL 浪潮的尾巴&#xff0c;以 PG 生态为基础 用C实现的 支持 SQL 以及 CQL 语…

asp.net旅游交流管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net 旅游交流管理信息系统是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c# 语言开发 asp.net旅游交流网站1 应用技…

【Linux】jdk Tomcat MySql的安装及Linux后端接口部署

一&#xff0c;jdk安装 1.1 上传安装包到服务器 打开MobaXterm通过Linux地址连接到Linux并登入Linux&#xff0c;再将主机中的配置文件复制到MobaXterm 使用命令查看&#xff1a;ll 1.2 解压对应的安装包 解压jdk 解压命令&#xff1a;tar -xvf jdk 加键盘中Tab键即可…

Elasticsearch:从头开始解释带有 Transformer 的生成式 AI 架构

作者&#xff1a;ARIS PAPADOPOULOS 这篇长篇文章解释了生成式人工智能的工作原理&#xff0c;从基础一直到注重直觉的生成式 transformer 架构。 这篇长篇文章解释了生成式人工智能的工作原理&#xff0c;从基础一直到生成式 transformer 架构。 重点是直觉&#xff0c;而不是…

jeecg-uniapp 杂七杂八数据

uniapp 点击事件 tap: 单击事件 confirm: 回车事件 blur:失去焦点事件 touchstart: 触摸开始事件 touchmove: 触摸移动事件。 touchend: 触摸结束事件。 longpress: 长按事件。 input: 输入框内容变化事件。 change: 表单元素值变化事件。 submit: 表单提交事件。 scroll: 滚动…

十九、类型信息(4)

本章概要 注册工厂类的等价比较反射&#xff1a;运行时类信息 类方法提取器 注册工厂 从 Pet 层次结构生成对象的问题是&#xff0c;每当向层次结构中添加一种新类型的 Pet 时&#xff0c;必须记住将其添加到 LiteralPetCreator.java 的条目中。在一个定期添加更多类的系统…

深入内核buddy分配器(芯驰X9/杰发8015 buddy系统明明还有几十M到100多M内存,却分配4k内存失败)

如上图内核打印分配4K内存失败&#xff0c;但是normal 类型的buddy系统还有大量内存。居然分配失败。源码分析&#xff1a; 根据logfaddr2line定位到&#xff0c;调用栈为__alloc_pages_slowpath——》get_page_from_freelist——》zone_watermark_fast 可以看到buddy内存低于…

【ChatGPT瀑布到水母】AI 在驱动软件研发的革新与实践

这里写目录标题 前言内容简介作者简介专家推荐读者对象目录直播预告 前言 计算机技术的发展和互联网的普及&#xff0c;使信息处理和传输变得更加高效&#xff0c;极大地改变了金融、商业、教育、娱乐等领域的运作方式。数据分析、人工智能和云计算等新兴技术&#xff0c;也在不…

什么是互动广告

随着数字技术的迅速发展和消费者行为的转变&#xff0c;互动广告已成为现代广告行业的重要组成部分。互动广告以其独特的优势和形式&#xff0c;不断刷新人们对广告的认知&#xff0c;为广告行业带来新的机遇和挑战&#xff0c;那么就来一起了解互动广告吧。 一、互动广告的定义…

机器学习---使用 TensorFlow 构建神经网络模型预测波士顿房价和鸢尾花数据集分类

1. 预测波士顿房价 1.1 导包 from __future__ import absolute_import from __future__ import division from __future__ import print_functionimport itertoolsimport pandas as pd import tensorflow as tftf.logging.set_verbosity(tf.logging.INFO) 最后一行设置了Ten…

单目深度估计之图像重构原理解析

一、参考资料 浅析自监督深度估计中的光度损失(Photometric Loss) 二、图像重构原理 设输入位姿估计网络的3帧连续单目序列为 < I t − 1 , I t , I t 1 > <I_{t-1},I_{t},I_{t1}> <It−1​,It​,It1​>&#xff0c;其中 t t t 为时间索引&#xff0c;…

问题 C: 搬寝室(DP)

算法分析&#xff1a; 题目意思为求n个物品&#xff0c;拿k对使得消耗的体力最少&#xff0c; 或者说是这k对物品&#xff0c;每一对中两件物品的质量差平方最小&#xff0c; 所以要使得质量差的平方小&#xff0c;只能排序后取质量相邻两个物品作为一对&#xff1b; 现在设f…

学习Python,为什么可以轻松应对工作大小事?

Python&#xff0c;大名鼎鼎&#xff0c;它在工作中到底能发挥什么样的作用&#xff1f;在现代职场&#xff0c;Python如同一把瑰丽的多功能钥匙&#xff0c;能打开各行各业的大门。无论你是行政助手、财务分析师、电商经营者&#xff0c;还是数据研究员&#xff0c;Python都能…

四、[mysql]索引优化-1

目录 前言一、场景举例1.联合索引第一个字段用范围查询不走索引(分情况&#xff09;2.强制走指定索引3.覆盖索引优化4.in和or在表数据量比较大的情况会走索引&#xff0c;在表记录不多的情况下会选择全表扫描5.like 后% 一般情况都会走索引(索引下推) 二、Mysql如何选择合适的索…

2021年06月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下列代码后,运行结果是? seq=[hello,good,morning] s=*.join(seq

处理固定资产折旧报错 AFAB “根据记帐循环, 您必须接下来对期间 001记帐”

会计在运用进行固定资产折旧时&#xff0c;发现有个报错“根据记帐循环, 您必须接下来对期间 001记帐”&#xff0c; 根据记帐循环, 您必须接下来对期间 001记帐 消息编号 AA683 诊断 不可以在指定的期间过帐折旧&#xff0c;因为此操作会遗漏过帐期间。 系统响应 该期间不能进…

软件测试面试,一定要准备的7个高频面试题(附答案,建议收藏)

问题1&#xff1a;请自我介绍下&#xff1f; 核⼼要素&#xff1a;个⼈技能优势⼯作背景经验亮点参考回答&#xff1a; 第一种&#xff1a;基本信息离职理由 ⾯试官您好&#xff0c;我叫张三&#xff0c;来⾃番茄市&#xff0c;在软件测试⾏业有 3 年的⼯作经验。做过 Web/APP…

剑指offer(C++)-JZ5:替换空格(算法-其他)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 题目描述&#xff1a; 请实现一个函数&#xff0c;将一个字符串s中的每个空格替换成“%20”。 例如&#xff0c;当字符串为We A…

网页2D/3D的开发框架

开发2D和3D网页的框架有很多&#xff0c;具体选择取决于您的项目需求和个人偏好。以下是一些常用的2D和3D网页开发框架&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 2D 网页开发框架&#xff1a; …