【Linux】进程理解与学习Ⅲ-环境变量
环境:centos7.6,腾讯云服务器
Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹
相关文章推荐:
【Linux】冯.诺依曼体系结构与操作系统
【Linux】进程理解与学习Ⅰ-进程概念
浅谈Linux下的shell--BASH
【Linux】进程理解与学习Ⅱ-进程状态
前言
什么是变量?
在学习之前我们要先搞清楚这个概念,就比如说【y=ab+cd】,在这里,等号左边的就是变量,等号右边的则是变量的内容。变量是bash中非常重要的一个存在,在Linux下变量又分为自定义变量以及环境变量。本次章节讲对此做相关理解。
变量的定义与查看
变量的定义与查看
由我们用户自己来直接定义的变量叫做自定义变量(也可以说时本地变量),上面说过等号左边为变量名,右边为变量的内容,我们便可以根据此特点直接定义一个自定义变量。(我们可以通过echo $变量名来查看该变量的内容)如下:
★注意点:
这里我们在定义变量时,有以下几点需要注意:
等号两边不能直接跟空格,否则会报错
等号左边的变量名的开头只能是英文字母(比如:2myval这种写法错误)
假如我们想要保持一个变量的内容,并用该变量名去定义另一个变量时,我们要在该变量名称前加上$符号(比如我用myval的内容去定义age,就要写成age=$myval.其中$的作用便是保留原有变量的内容,记住这一点,后面配置PATH中会用到此特点)
在定义变量时,前面加export,就会将该变量导入环境变量表中(环境变量后面会讲)
变量的取消定义
我们可以使用unset 变量名的指令来取消该变量的定义,如下:
环境变量
什么是环境变量呢?相信学习Java、Python的老铁们应该会有一个更深刻的认识,因为在写Java之前,相信大家都会安装jdk,并在Windows下配置相关环境变量,配置完成后才能正常编写。如下图所示,这就是Windows下的环境变量:
说了这么多,还是没说到环境变量究竟是什么?
实际上环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。Linux中同样也存在着相关的环境变量。
这里举个例子:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
不仅如此,环境变量通常还具有全局属性,并且一般都是以大写字符来表示。而由各个环境变量在一起构成的集合,一般我们称之为环境变量表,环境变量表可以被子进程继承。(先说结论)
常见环境变量
以上所讲都只是一些概念层次的知识,接下来我们讲几个比较常见的环境变量,以便于大家能更好的理解。
PATH : 指定命令的搜索路径
SHELL : 当前Shell,它的值通常是/bin/bash。
USER:当前用户
PATH
我们在写完代码并编译,生成一个可执行程序时,为什么运行的时候要加./?实际上运行一个程序的前提是找到该程序。只有找到它,才能运行它,而./的含义大家应该知道,表示的是当前所在路径。
那么为什么我们输入ls的时候,则不用指定ls所在的具体位置呢?这里就涉及到了PATH,我们可以输入指令echo $PATH来查看PATH这个环境变量的内容,并且输入指令which ls:来查看ls所在的路径。就会发现原来ls所在的路径在PATH里。
而PATH的作用则是指定搜索路径,所以我们输入指令ls的时候,会自动去PATH中搜寻路径,发现PATH中有ls所在的路径,因此我们直接输入ls的时候,不用我们手动指定路径,也可以运行ls。但是如果我们不手动指定我们自己写的程序mytest,则会报错,因为环境变量中并没有mytest所在的路径。
那么我们可不可以像Windows一样,配置我们的环境变量呢?答案是可以的。
PATH环境变量的配置
我们可以使用指令export PATH=$PATH:自定义路径(上面在变量的定义中讲了$的作用就是保留PATH的原有内容,PATH中:是分隔符,所以我们这样来定义就相当于给PATH追加了一个内容。)如下:
环境变量的查看
一、env指令
我们可以直接输入指令env,便可以查看当前bash下的所有环境变量
二、通过指针数组访问
实际上,我们的环境变量表是一个指针数组结构,而环境变量会被子进程所继承。我们便可以利用此特点来使用我们自己写的函数打印出环境变量。其实我们在写main函数时,实际上main函数有三个参数:int argc、char* argv[]、char*envp[]。而char*envp[]这个指针数组中的内容,就指向我们所说的环境变量表的内容的起始地址。如下:
我们可以通过代码来验证一下:
#include<stdio.h> int main(int argc,char* argv[],char* envp[]){ for(int i=0; envp[i]; ++i){ printf("envp[%d]:%s\n",i,envp[i]);} }
三、通过全局变量environ获取
#include<stdio.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]);}}
四、通过系统调用函数getenv()来获取我们想要的环境变量
我们可以通过系统调用函数getenv()来获取我们想要查看的环境变量,如下:
#include<stdio.h>
#include<stdlib.h>//头文件int main(){printf("%s",getenv("PATH"));}
关于环境变量的理解
先来看以下代码:
我们从中可以得出结论:
只有环境变量会被子进程所继承,自定义变量并不会。自定义变量只能在自己的shell内使用。实际上在环境变量的查看中我们也验证了这一点:即main函数实际上的第三个参数,便是用来接收环境变量表的指针数组。
★总结
上面讲的有些零碎,这里做一个总结:
【y=a】等号左边表示的是变量名,右边表示变量内容
我们可以通过echo $变量名的指令,来查看该变量的内容
在定义变量时,前面加上export,则会将该变量导入环境变量表
环境变量表实际上是所有环境变量的集合,本质上是一个指针数组,每一个数组元素都是指针,指向对应的环境变量的内容的起始位置。(最后一个位置为NULL)
set指令会打印出所有的变量的内容(本地、环境),env则只打印环境变量的内容
环境变量我们可以通过main函数中的指针数组来查看(环境变量会被子进程继承,所以我们写的程序也可以拿到父进程bash的环境变量表)、也可以通过全局变量environ来查看,或者通过函数getenv()来获取。
环境变量可以被所有子进程继承,但是自定义变量则只可以在自己的shell中使用。
我们可以通过unset 环境变量名 来取消该环境变量。
环境变量实际上是内存级别的一张表,当我们登录系统时,os会给用户形成特定的环境变量表。而环境变量对应的数据实际上保存在了系统的相关配置文件中(bashrc、profile等)。
命令行参数
在上面我们讲到了main函数中的三个参数,为int argc、char* argv[]、char* envp[]。其中我们了解了第三个参数,也就是用来接收环境变量表的指针数组。那么前面两个呢?
argc:传入的元素个数(也就是我们输入的指令的个数)
char* argv[]:也是一个表,只不过这张表存放的是指向传入的元素的起始位置的指针。其中,最后一个有效元素的下一个内容为NULL(这张表由bash制作)
当然,我们也可以写以下代码来验证:
#include<stdio.h>//argc:传入的元素个数 //argv:用来存放元素内容起始位置的指针数组int main(int argc,char* argv[]) { printf("传入的元素个数为:%d\n",argc);printf("传入的有效元素内容为:\n"); for(int i=0; i<argc; i++) { printf("argv[%d]:%s\n",i,argv[i]);} return 0; }
为什么我们输入ls -a 与ls -l 的功能不同,原理也在于此,即对命令行参数进行相关指令设置。我们也可以实现一个简单的任务:如下:
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<unistd.h>void Utest(char* st){printf("%s:-[a | b]\n",st);}int main(int argc,char* argv[]){//身份验证,只有qidunyan用户可以进行操作if(strcmp(getenv("USER"),"qidunyan")){printf("%s用户非法\n",getenv("USER"));return 0;}//指令输入错误 if(argc!=2){printf("指令错误,请重新输入:\n");Utest(argv[0]);}
// ./mytest -aif(strcmp(argv[1],"-a")==0){printf("执行A任务\n");//...sleep(3);printf("执行完毕\n");} else if(strcmp(argv[1],"-b") == 0){printf("执行B任务\n");//...sleep(3);printf("执行完毕\n");}else {printf("指令错误,重新输入:\n");Utest(argv[0]);}return 0;}
end.
生活原本沉闷,但跑起来就会有风!🌹
相关文章:
【Linux】进程理解与学习Ⅲ-环境变量
环境:centos7.6,腾讯云服务器Linux文章都放在了专栏:【Linux】欢迎支持订阅🌹相关文章推荐:【Linux】冯.诺依曼体系结构与操作系统【Linux】进程理解与学习Ⅰ-进程概念浅谈Linux下的shell--BASH【Linux】进程理解与学习…...
【三】一起算法---栈:STL stack、手写栈、单调栈
纸上得来终觉浅,绝知此事要躬行。大家好!我是霜淮子,欢迎订阅我的专栏《算法系列》。 学习经典算法和经典代码,建立算法思维;大量编码让代码成为我们大脑的一部分。 ⭐️已更系列 1、基础数据结构 1.1、链表➡传送门 1…...
电路设计的一些概念
锁存器的产生 论述1 (转)时序电路,生成触发器,触发器是有使能端的,使能端无效时数据不变,这是触发器的特性。 组合逻辑,由于数据要保持不变,只能通过锁存器来保存。 第一个代码,由于是时序逻…...
【Linux】Linux下权限的理解
前言:在之前我们已经对基本的指令进行了深入的学习,接下来我将带领大家学习的是关于权限的相关问题。在之前,我们一直是使用的【root】用户,即为“超级用户”,通过对权限的学习之后,我们就会慢慢的切换到普…...
Prometheus监控实战系列十七:探针监控
目前对于应用程序的监控主要有两种方式,一种被称为白盒监控,它通过获取目标的内部信息指标,来监控目标的状态情况,我们前面介绍的主机监控、容器监控都属于此类监控。另一种则是“黑盒监控”,它指在程序外部通过探针的…...
题目:JPA的懒加载失效是什么情况?
题目:JPA的懒加载失效是什么情况?Q1:什么是JPA的懒加载?Q2:JPA的懒加载会在什么情况下失效?Q3:如何避免JPA的懒加载失效?前言:在使用JPA进行数据库操作时,懒加…...
十六、消息推送
一、什么是消息推送? 消息推送通常是指网站的运营工作等人员,通过某种工具对用户当前网页或移动设备 APP 进行的主动消息推送。 消息推送一般又分为 Web 端消息推送和移动端消息推送。 消息推送无非是推(push)和拉(p…...
PMP项目管理-【第一章】引论
项目知识体系: 项目管理知识体系: 1.1 项目特性 独特性:独特性会带来不确定性(风险) 临时性:1> 任何项目都有起始终止时间 2> 项目具备临时性,项目成果可能是永久的 1.2 项目驱动变革 从商业角度来看,…...
前端布局小案例,分享3个漂亮的卡片组件
当今互联网发展迅猛,各种应用、网站和软件层出不穷,其中前端技术的发展更是让人瞩目。随着用户对于界面设计的要求越来越高,漂亮的卡片组件在各类网页设计中变得越来越流行。本文将分享三个精美的卡片组件,帮助您在前端开发中轻松…...
博客重载记录
博客重载记录流控算法实现open系统调用流程二分查找前言: 有时候看了一些比较好的文章,过几天就忘了,想想不如自己实现一遍博客代码或按博客结构自己写一遍,加深印象,但把别人的内容改个名字变成自己的博客,…...
open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()
OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。 绘图函数的一些公众参数: img :图像对象 color: 颜色,如果彩色用一个三元组表示,三元组的元素按照B-G-R组织,三元组(0,255,0)中B为0,G为2…...
基于 PyTorch + LSTM 进行时间序列预测(附完整源码)
时间序列数据,顾名思义是一种随时间变化的数据类型。 例如,24小时内的温度、一个月内各种产品的价格、某家公司一年内的股票价格等。深度学习模型如长短期记忆网络(LSTM)能够捕捉时间序列数据中的模式,因此可以用于预…...
GEE页面介绍
目录一、背景二、用户界面三、数据类型:栅格1、请求图像集合2、学习查看栅格元数据3、矢量实例一:四、数据集五、数据属性1、空间分辨率2、时间分辨率六可视化多个波段1、真彩色(TCI)2彩色红外(CI)3、伪色 1 和 2 (FC1/FC2)七、可…...
python自动发送邮件,qq邮箱、网易邮箱自动发送和回复
在python中,我们可以用程序来实现向别人的邮箱自动发送一封邮件,甚至可以定时,如每天8点钟准时给某人发送一封邮件。今天,我们就来学习一下,如何向qq邮箱,网易邮箱等发送邮件。 一、获取邮箱的SMTP授权码。…...
hastcat
hashcat 下载地址: https://hashcat.net/hashcat/ 案例 Usage: hashcat [options]... hash|hashfile|hccapxfile [dictionary|mask|directory]...https://xz.aliyun.com/t/4008破解linux shadow /etc/shadow中密码格式: $id$salt$encrypted如:$1$2eWq10AC$NaQqalCk3 1表…...
242. 一个简单的整数问题
Powered by:NEFU AB-IN Link 文章目录242. 一个简单的整数问题题意思路代码242. 一个简单的整数问题 题意 给定长度为 N的数列 A,然后输入 M行操作指令。 第一类指令形如 C l r d,表示把数列中第 l∼r个数都加 d 第二类指令形如 Q x,表示询问…...
docker安装Redis高可用(一主二从三哨兵)
本次教程使用docker swarm安装 准备三台机器 hostIP用途node1192.168.31.130redis-master01,redis哨兵节点01node2192.168.31.131redis-slave01, redis哨兵节点02node3192.168.31.132redis-slave02 redis哨兵节点02 注意事项: 1:需要保证三…...
安全防御之入侵检测篇
目录 1.什么是IDS? 2.IDS和防火墙有什么不同?3.IDS的工作原理? 4.IDS的主要检测方法有哪些?请详细说明 5.IDS的部署方式有哪些? 6.IDS的签名是什么意思?签名过滤器有什么用?例外签名的配置作…...
学习系统编程No.10【文件描述符】
引言: 北京时间:2023/3/25,昨天摆烂一天,今天再次坐牢7小时,难受尽在不言中,并且对于笔试题,还是非常的困难,可能是我做题不够多,也可能是没有好好的总结之前做过的一些…...
网络基础认识
目录 一、计算机网络背景 1.1 网络发展 1.2 "协议"由来 二、网络协议初识 2.1 协议分层 2.2 OSI七层模型 2.3 TCP/IP五层模型 三、网络协议栈 四、数据包封装与分用 五、网络传输基本流程 5.1 同局域网的两台主机通信 5.2 跨网络的两台主机通信 六、网络…...
【蓝桥杯_练习】
蓝桥杯1.创建工程2.LED灯点亮led.c3.LCD液晶屏显示lcd.c4.定时器按键单机interrupt.hinterrupt.cman.c5.定时器(长按键)interrupt.hinterrupt.cmain.c6.PWMmain.c7.定时器-输入捕获(频率,占空比测量)interrupt.cmain.c…...
【C语言蓝桥杯每日一题】——跑步锻炼
【C语言蓝桥杯每日一题】—— 跑步锻炼😎前言🙌排序🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者简介…...
Qt之实现类似软件安装时的新功能介绍界面
一.效果 在软件安装时,一般会轮播软件的新功能,安装后,如果还想查看这些新功能该怎么办呢,我们可以把这个介绍新新功能的小应用集成到软件的“帮助”菜单中,比起纯黑文字的无趣介绍,图文方式的呈现会生动得多。 最近在看《赘婿》,借几张图过来用用。 二.原理 1.分层结…...
echarts地图不同地区设置不同的颜色
var myChart ec.init(document.getElementById(main));let option {tooltip: {trigger: item,},dataRange: {//左下角的颜色块。start:值域开始值;end:值域结束值;label:图例名称;color:自定义…...
网易云音乐API部署Vercel获取接口过程
前提:部署自己的网易云接口主要用途在于在完成前端的仿网易云播放器的时候,根据自己部署的接口可以用于获取数据。大体流程是通过在github上fork别人的API接口项目,然后在Vercel部署即可获得自己的网易云后端数据接口了,不过根据我…...
Java基础:字符串(String)及常用操作
目录 字符串的声明及创建 字符串的操作 连接字符串(或concat) 获取字符串的长度 length 查找字符串 indexOf 获取字符串某个位置的字符 charAt 查询某个字符串是否存在 contains 截取字符串 substring(一) 截取字符串 su…...
FL Studio 21中文版支持主题随心换,FL Studio 21Mac版新增对苹果M2/1家族芯片原生支持。
FL Studio 21.0.0 官方中文版重磅发布 纯正简体中文支持,更快捷的音频剪辑及素材管理器,多样主题随心换! Mac版新增对苹果M2/1家族芯片原生支持。 更新版本:21.0.0支持语言:简体中文/英语更新时间:2022.12…...
【蓝桥杯集训·周赛】AcWing 第96场周赛
文章目录第一题 AcWing 4876. 完美数一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第二题 AcWing 4877. 最大价值一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解第三题 AcWing 4878. 维护数组一、题目1、原…...
【数据结构】顺序表的深度刨剖析
前言:在上一篇文章中,我们已经对数据结构有了一定了解,我们可以通过优化空间复杂度或者时间复杂度从而提高我们程序运行或存储速率。至此我们就知道了数据结构的重要性,所以今天我们将要了解和学习一种实用的数据结构——线性表。…...
Unity 之 使用原生UGUI实现随手移动摇杆功能经典实例
Unity 之 使用原生UGUI实现随手移动摇杆功能实现效果一,实现思路1.1 原理解析1.2 思路概述二,实现代码2.1 随手落下2.2 摇杆转动三,源码分享3.1 场景搭建3.2 完整代码3.3 实现效果实现效果 本文最终实现效果: 一,实现…...
汕头网站建设网站建设/会计培训班要多少钱一般要学多久
常用的两种解决方案: 第一:使用IE滤镜解决 关键代码: css代码 _background:none;_filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(srccss/images/png24.png,sizingMethodcrop); 有几点注意点: 1:这里对…...
做身份证网站/市场推广方案怎么做
Angular 中的路由 一、 Angular 创建一个默认带路由的项目 命令创建项目 ng new ng-demo --skip-install 创建需要的组件 ng g component components/home ng g component components/news ng g component components/newscontent找到 app-routing.module.ts 配置路由 引入…...
网易企业邮箱登录入口登录入口/seo是什么职位缩写
引言在可观察性领域,Metrics,Tracing 和 Logging 的介绍由来已久。三种之间的边界越来越模糊。OpenTracing 中已经支持 LogEvent,OpenTelemetry 已经把 OpenMetric 和 OpenTracing 整合到一块。今天我们要介绍的链路追踪的业务分析功能&#…...
郑州网站模板建设/东莞做网页建站公司
你可能还记得使用vue-cli 创建vue项目。当创建项目完成后,我们进入到项目目录,启动cmd命令窗口,输入npm install,它就会安装一堆东西(依赖),然后再输入npm run dev, 我们就可以看到网页了,整个项目启动成功…...
广西南宁网站建设/指数工具
首先是用java来实现简单的Server端(http的请求内容格式可以参考msdn:http://msdn.microsoft.com/zh-cn/library/hh202945(vvs.92)): /*** 推送toast通知* param uriString 推送服务通知uri* param title toast标题* param content toast内容* param param 页面跳转参…...
兴义建设局网站/最常见企业网站有哪些
Monoid,独异点 独异点是一个,集合只包含单位元,单个二元关系运算的代数结构。 单位元,identity element 单位元是(二元运算符)集合中的一种特殊类型的元素,当与另一元素进行二元运算时ÿ…...