【Linux 学习计划】-- 命令行参数 | 环境变量
目录
命令行参数
环境变量
环境变量的本质是什么?
相关配置文件
修改环境变量的相关操作
代码获取env —— environ
内建命令
结语
命令行参数
试想一下,我们的main函数,也是一个函数,那么我们的main函数有没有参数呢?
有的兄弟有的,main函数其实可以有三个参数,但是现在我们只讲其中两个,因为最后一个和下文要讲的环境变量有关
而前两个分别是argc和argv,不理解没关系,我们直接来看代码:
我们可以看到,我们命令行上的参数,直接在执行文件后面加的东西,会直接被main函数的两个参数给捕捉到
其中,argc就是后面加上的参数的数量加上执行文件的名字本身
而 argv 则是这些变量的具体字符串
那么这些个参数具体有什么用呢?换句话说,看到这样子的执行方式,有没有感觉有一点熟悉
这不就是我们指令的执行方式吗?!!
我们的 ls -a -l,rm -r -f 等等,这些都是执行文件加上指令啊!
所以,main函数参数的本质其实就是分配给一个可执行文件的不同任务,每一个任务都有对应的效果,写一个小代码就明白了:
而这些工作在未来,都是交给子进程去做的
但是有一个问题,进程不是互相之间独立的吗?为什么子进程能做?main函数在外面的命令行参数,本质上不是传给父进程的吗?
这其实是后面关于程序地址空间的相关内容,这里不做介绍,只需要知道——子进程刚创建的时候,数据都是拷贝自父进程的,所以子进程能有一样的数据,也就能够使用、执行对应的任务了
但是由于是拷贝,所以子进程能够看见父进程的数据,但是父进程看不到子进程的
环境变量
先来看一看环境变量中的 PATH:
这个路径,就是平常程序要找相关可执行文件(指令)时候会找的路径
换句话说,我们平常写完可执行程序之后,都需要 ./XXX进程运行,但是指令则不需要,这是因为默认环境变量中的PATH已经将这些路径给记录下来了,所以不用./
所以,只要我们将自己的路径放在里面,我们的程序也能不用 ./ 而是直接执行是吗?yes
环境变量的本质是什么?
在程序开始之前,由于我们的bash(命令行解释器)也是一个进程,所以系统会将部分文件直接加载进bash进程之中,通过什么方式?mian函数的命令行参数!!(这个在下文讲)
相关配置文件
当我们来到自己的家目录下,我们可以看到里面有两个隐藏文件,我们可以打开其中的.bash_profile
我们可以清楚地看到第10行,这里面就是我们的PATH地址
而我们现在在这后面加上我们自己的地址,这时候就代表:
因为系统在我们登录的时候,就是将着些个文件加载进bash进程之中,所以我们现在每一次登PATH 都会是这样
之前的由于我们只是在bash进程内部,比如说用PATH=$PATH:自己的地址 这样的方式进行更改,在我们退出登录之后,他就没了,下一次登录就是默认的样子,因为这只是内存级的
现在我们改完配置文件之后重新登录:
就可以看见,确实是生效了
修改环境变量的相关操作
首先是查看,这里我们用 echo $XXX 来查看对应的环境变量,其中XXX代表某个环境变量的名字
如果我们想要一键查看所有环境变量的话,我们可以直接使用 env 进行查看:
其中我们也可以看见一些熟悉的变量
接着,如果我们想将一个新的变量变成环境变量的话,我们可以使用export name,反之如果不想让其当环境变量了,就可以使用unset name来进行修改
用了unset之后,确实就没有了
注意,上面这些都是命令行获取环境变量的相关操作
首先,这些操作都是内存级的。下次登录的时候默认就恢复了,所以可以随便改(别改到配置文件就好)
其次,我们还可以使用代码获取对应的环境变量,比如environ,getenv("name")这样的方式,这些我们放在下文,穿插在知识点里面进行讲解
代码获取env —— environ
我们来看这么一个代码,environ 具体是什么我们待会儿说,先来看效果:
这是我们程序运行的结果,可以看到,这不就是我们刚刚直接用env指令看到的环境变量吗?
但是,为什么我们能通过指令来看到这些环境变量呢?
首先,环境变量是从磁盘的配置文件,在我们登录的时候加载进bash进程里面的
今天我们写了一个新进程,而这个进程必然是bash用fork创建出来的子进程,后面在学地址空间的时候就会知道,子进程的数据就是拷贝自父进程的
那么这个时候,我们自然就能够看到父进程(bash)的相关数据咯
至于是怎么看到的?里面的environ,就是 char* envp[ ] ,也就是我们前文提到的main函数的第三个参数
我们可以这么理解,在bash进程启动的时候,默认会给子进程创建两张表,一张是argv也就是指令表,还有一张就是环境变量表——即环境变量也是被管理起来的
而这个environ,就是这个环境变量表的头指针
这也就是为什么我们在代码就能够获得环境变量
那还有别的用代码获取环境变量的方式吗?这样一次性获取太多了,我要固定获取某一个环境变量的方式有吗?
有的兄弟有的 —— getenv("name")
比如这样写,但是需要注意的是,这个函数需要包含头文件stdlib.h
综上,我们现在获取环境变量的方式有三种:
- environ指针
- main函数参数
- getenv
内建命令
不知道各位在上面看到export的时候,有没有觉得有些奇怪
export不是一个指令吗?那照我们前面学的,bash会开一个子进程来执行他
但是,子进程可以看见父进程的数据,因为子进程的创建就是拷贝自父进程
但是我们今天用export将变量变成环境变量,这样父进程不是看见了子进程的数据吗?这对吗兄弟?
对的兄弟对的,因为export这样的命令并不是普通的命令,他有一个一个名称叫做内建命令
如果说别的比如 ls 指令,是通过fork然后让子进程跑起来,那么export就好像直接是void export()这样,直接写函数实现,所以他根本就没有创建子进程,这也就是为什么变量能变成环境变量
比如echo也是一个内建命令
我们可以做一个测试,我们的PATH不是负责管理指令的路径吗?如果PATH直接变成空,那么所有的普通指令不就跑不了了吗:
结语
这篇文章到这里就结束啦!!~( ̄▽ ̄)~*
如果觉得对你有帮助的,可以多多关注一下喔
相关文章:

【Linux 学习计划】-- 命令行参数 | 环境变量
目录 命令行参数 环境变量 环境变量的本质是什么? 相关配置文件 修改环境变量的相关操作 代码获取env —— environ 内建命令 结语 命令行参数 试想一下,我们的main函数,也是一个函数,那么我们的main函数有没有参数呢&am…...

服务器Docker容器创建与VScode远程连接SSH使用
一、拉取容器 1、win r 输入cmd打开终端命令行 2、终端输入 ping 192.168.xx.xxx 查看是否连接到服务器。如输出显示“字节 时间 TTL”等如下界面,则连接成功。否则输出“请求超时” 如果不能连接,则需要修改设备的IP,需要在设置-网络和In…...
体现物联网环境下安全防护的紧迫性 :物联网环境下的个人信息安全:隐忧与防护之道
摘要:随着物联网的飞速发展,个人信息在物联网环境下面临的安全风险日益严峻。本文深入探讨了物联网环境下个人信息泄露的主要途径,分析了当前个人信息安全保护面临的挑战,并从技术、法律、企业责任和个人意识等多方面提出了相应的…...

LiveQing 视频点播流媒体 RTMP 推流服务功能:搭建 RTMP 视频流媒体服务详细指南
LiveQing视频点播流媒体RTMP推流服务功能:搭建RTMP视频流媒体服务详细指南 一、流媒体服务搭建二、推流工具准备三、创建鉴权直播间四、获取推流地址五、配置OBS推流六、推流及播放七、获取播放地址7.1 页面查看视频源地址7.2 接口查询 八、相关问题解决8.1 大疆无人…...

LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 · 下
前五道题:LeetCode 高频 SQL 50 题(基础版)之 【连接】部分 上 题目:577. 员工奖金 题解: select r.name,b.bonus from Employee r left join Bonus b on r.empIdb.empId where b.bonus <1000 or b.bonus is nul…...

【正点原子STM32】RS485串行通信标准(串口基础协议 和 MODBUS协议、总线连接、通信电路、通信波形图、RS485相关HAL库驱动、RS485配置步骤、)
一、RS485介绍 二、RS485相关HAL库驱动介绍 三、RS485配置步骤 四、编程实战 五、总结 串口、 UART、TTL、RS232、RS422、RS485关系 串口、UART、TTL、RS232、RS422和RS485之间的关系可以如此理解: 串口:是一个广义术语,通常指的是采用串行通…...
从SPDY到HTTP/2:网络协议的革新与未来
从SPDY到HTTP/2:网络协议的革新与未来 在互联网的发展史上,协议的演进始终是推动用户体验提升的关键。从早期的HTTP/1.1到如今的HTTP/2,再到即将全面普及的HTTP/3,每一次变革都伴随着性能、安全性和效率的突破。今天,…...

在力扣刷题中触摸算法的温度
在代码的世界里,每一道力扣题目都是一扇通往未知的门。当我推开这些门,与内置求和函数、二进制位运算、辗转相减思想以及链表结构相遇时,才真正触摸到算法的温度 —— 那是一种理性与智慧交织的炽热,也是思维不断淬炼的滚烫。 最…...

外部访问可视化监控 Grafana (Windows版本)
Grafana 是一款通用,美观的,强大的可视化监控指标的展示工具。可以将不同的数据源数据以图形化的方式展示。它支持多种数据源,如 Prometheus 等,可以满足不同的需求。也可以通过插件和 API 进行扩展满足各种需求,…...

通用的防御框架,用于抵御(多模态)大型语言模型的越狱攻击
大家读完觉得有帮助记得关注!!! 摘要 尽管(多模态)大型语言模型(LLMs)因其卓越的能力而受到广泛关注,但它们仍然容易受到越狱攻击。已经提出了各种防御方法来防御越狱攻击ÿ…...
聊聊JVM怎么调优?(实战总结)
JVM 核心配置与调优指南 一、堆内存与年轻代配置(影响最大) 堆内存大小: 在资源允许的前提下,堆内存应尽可能设置得更大。关键点: 必须将堆内存的最大值 (-Xmx) 和最小值 (-Xms) 设置为相同值。动态扩容会触发 Full G…...

新能源汽车电控系统的精准守护者PKDV5355高压差分探头
在新能源汽车的"心脏"——电控系统中,每一次电流的精准切换都关乎车辆的性能与安全。PRBTEK PKDV5355高压差分探头就像一位经验丰富的"汽车医生",帮助工程师们精准捕捉IGBT模块的每一次"心跳",确保电驱系统健康…...

C# 导出word 插入公式问题
最近遇到了一个问题,下载一个文档时需要下载word可编辑的公式。找了很久终于找到了一种解决办法。下面是以C#代码来实现在Word中插入公式的功能。 目录 一、引入dll程序集文件1、通过 NuGet 引入dll(2种方法)的方法:2、手动添加d…...

Mac安装配置InfluxDB,InfluxDB快速入门,Java集成InfluxDB
1. 与MySQL的比较 InfluxDBMySQL解释BucketDatabase数据库MeasurementTable表TagIndexed Column索引列FieldColumn普通列PointRow每行数据 2. 安装FluxDB brew update默认安装 2.x的版本 brew install influxdb查看influxdb版本 influxd version # InfluxDB 2.7.11 (git: …...

手撕Java+硅基流动实现MCP服务器教程
手撕Java硅基流动实现MCP服务器教程 一、MCP协议核心概念 MCP是什么 MCP 是 Anthropic (Claude) 主导发布的一个开放的、通用的、有共识的协议标准。 ● MCP 是一个标准协议,就像给 AI 大模型装了一个 “万能接口”,让 AI 模型能够与不同的数据源和工…...

EasyRTC嵌入式音视频通信SDK助力1v1实时音视频通话全场景应用
一、方案概述 在数字化通信需求日益增长的今天,EasyRTC作为一款全平台互通的实时视频通话方案,实现了设备与平台间的跨端连接。它支持微信小程序、APP、PC客户端等多端协同,开发者通过该方案可快速搭建1v1实时音视频通信系统,适…...

Prometheus学习之pushgateway和altermanager组件
[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# pwd /usr/local/alertmanager-0.28.1.linux-amd64[rootnode-exporter41 /usr/local/alertmanager-0.28.1.linux-amd64]# cat alertmanager.yml # 通用配置 global:resolve_timeout: 5msmtp_from: 914XXXXX…...

01 redis 的环境搭建
前言 这一系列文章主要包含的内容主要是 各种常用软件的调试环境的搭建 主要的目的是 搭建一个可打断点的一个调试环境 c 系列 主要是基于 clion 调试, java 系列主要是基于 idea 调试, js 系列主要是基于 webstorm 调试 需要有一定的 c, c, java, js 相关基础 基于的…...

《操作系统真相还原》——加载器
显存 将上一章的中断输出,变为显存输出 加载器 使用mbr引导程序从磁盘中加载loader程序。 MBR %include "boot.inc" SECTION MBR vstart0x7c00 mov ax,cs mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00mov ax,0xb800mov gs,ax;cl…...
电网即插即用介绍
一、统一设备信息模型与标准接口 实现即插即用功能的基础在于建立统一的设备信息模型。不同厂家生产的各类电网设备,其内部结构、通信协议、数据格式等往往千差万别。通过制定统一的设备信息模型,能够对设备的各种属性、功能以及接口进行标准化定义&…...

HJ25 数据分类处理【牛客网】
文章目录 零、原题链接一、题目描述二、测试用例三、解题思路四、参考代码 零、原题链接 HJ25 数据分类处理 一、题目描述 二、测试用例 三、解题思路 基本思路: 首先理解题目,题目要求对规则集先进行排序,然后去重,这一步我…...
spring-boot redis lua脚本实现滑动窗口限流
因为项目中没有集成redisson,但是又需要用到限流,所以简单的将redisson中限流的核心lua代码移植过来,并进行改造,因为公司版本的redis支持lua版本为5.1,针对于长字符串的数字,使用tonumber转换的时候会得到…...
USB MSC
主机(如电脑)识别USB MSC(Mass Storage Class)设备中的文件,本质上是通过多层协议协作实现的,涉及USB枚举、SCSI命令传输和文件系统解析三个核心环节。以下是详细机制: 🔍 一、USB…...
css实现文字渐变
在前端开发中,给文字设置渐变色是完全可以实现的,常用的方式是结合 CSS 的 background、-webkit-background-clip 和 -webkit-text-fill-color 属性。下面是一个常见的实现方法: <!DOCTYPE html> <html lang"zh-CN"> …...

FART 自动化脱壳框架一些 bug 修复记录
版权归作者所有,如有转发,请注明文章出处:https://cyrus-studio.github.io/blog/ open() 判断不严谨 https://github.com/CYRUS-STUDIO/FART/blob/master/fart10/art/runtime/art_method.cc 比如: int dexfilefp open(dex_pat…...

基于Flask实现豆瓣Top250电影可视化
项目截图 概述 该项目旨在对豆瓣Top 250电影进行全面的数据分析,使用了Python爬虫、Flask框架进行开发,并采用了Echarts进行数据可视化以及WordCloud进行词云分析。应用展示了多个功能,如电影列表、评分分布、词频统计和团队信息。 主要功能…...

More SQL(Focus Subqueries、Join)
目录 Subqueries Subqueries That Return One Tuple Subqueries and Self Connection The IN Operator The Exists Operator The Operator ANY The Operator ALL Union, Intersection, and Difference(交并差) Bag Semantics Controlling Dupl…...
项目部署react经历
简单的说: 1. 编译打包并压缩为压缩包 2. 将压缩包上传到服务器(这里以宝塔面板为例:www/wwwroot/目录下) 3. 将文件解压生成比如:www/wwwroot/ttms/build/* 多文件 4. php 项目建站,选择静态ÿ…...

从图像处理到深度学习:直播美颜SDK的人脸美型算法详解
在直播的镜头前,每一位主播都希望自己“光彩照人”。但在高清摄像头无死角的审视下,哪怕是天生丽质,也难免需要一点技术加持。于是,美颜SDK应运而生,成为直播平台提升用户粘性和视觉体验的重要工具。 尤其是在“人脸美…...
智能教育个性化学习路径规划系统实战指南
引言 在数字化教育革命中,如何利用AI技术实现"因材施教"的千年教育理想?本文将通过构建一个完整的智能教育系统,演示如何基于Python生态(Django机器学习)实现从数据采集到个性化推荐的全流程。系统将通过分…...