Linux---命令行参数+环境变量

news2024/9/29 11:41:26

一、命令行参数

int main(int argc,char*argv[])
{
    //...
    return 0;
}

不知道有没有人见过这样的主函数,它带了两个参数,argv接收的参数就叫做命令行参数,因为它的参数是从命令行来的,给大家演示一下,大家就懂了

命令行中的命令会被按照空格分割成一个个字符串交给argv数组,args中存放数组的元素个数

那么我们就会发现,我们之前用的各种命令+选项,其实就是靠命令行参数实现的,我们可以根据不同的参数,实现不同的功能,下面写一个简易的命令行计算器程序

命令行参数可以支持各种指令级别的命令行选项的设置,所以我们如果有兴趣就可以模拟实现cat、ls、echo等简单的命令

二、环境变量

1.PATH

相信大家在一开始学Linux的时候都有一个困惑,那就是命令行上的指令本质就是程序,我写的也是程序,为什么像ls、cat、touch等等命令的执行不用加./,而自己的程序运行要加呢?

本质在于程序的运行,首先要找到这个程序的位置,而如果我们就只写程序名,操作系统只会在PATH中的路径上查找该程序,如果找到了就会执行,没找到就无法执行,而我们自己写的程序一般都不在PATH的路径上,所以我们的程序执行要自带路径./

当然我们可以将程序的路径加入PATH中

或者我们也可以将程序拷贝到PATH中的某个路径中,这个操作其实就相当于简易版的安装,而将程序从这些路径中删除,就相当于卸载操作,一般不建议这么做。

当然不用担心PATH被修改之后改不回来,这里的PATH是内存中的值,磁盘中的PATH并没有改变重启Linux后就会恢复。


2.PWD

我们有一个命令pwd能打印我们当前所在目录,本质是pwd命令读取了环境变量PWD中的值


3.HOME

不同的用户登录,会出现在各自的家目录,如root出现在/root,普通用户出现在/home/username为什么?

在登录时

1、输入了用户名和密码

2、认证是否匹配

3、形成环境变量(PATH/HOME/PWD等等),根据用户名,初始化HOME


系统中会存在大量的环境变量,每个环境变量都有它自己的特殊用途,其他的环境变量如下

我们还可以在代码中获取环境变量来完成一些特定的功能,比如限制用户的权限


我们还能通过给main函数传参,来获得环境变量

注意:main函数的三个参数的顺序不能改变。

我们会发现父子进程的环境变量的值一样,其实环境变量存放在下面的这样一张表中,和命令行参数类似。

两者都可以通过父进程传递给子进程,我们知道子进程的命令行参数是我们在命令行输入的命令转化来的,那么环境变量又是从哪里来的呢?

其实在操作系统启动的时候,会有相关的配置文件导入环境变量,可以理解为初始化的过程,我们在根目录下,能找到.bash_profile这样一个隐藏文件

这个文件里面存一些脚本,每一次登录的时候,你的bash进程会读取并执行该配置文件的内容,为bash进程形成一张环境变量表信息

所以我们之前修改的环境变量本质是在修改上面的那张表上的内容,也就是修改bash进程的环境变量(在内存中),不会影响磁盘中的配置文件,所以重启系统之后,环境变量就又恢复到默认的状态了。

如果我们想让每次打开系统都会有,我们可以将他写入这个配置文件中

我们也可以手动给bash进程加入一些环境变量

我们创建的变量只是本地变量,可以用echo查看,但是不在环境变量表中,得通过export命令将他们导入环境变量表中(再次强调这里的环境变量表只是内存中的) 

本地变量只在bash进程内部有效,不会被子进程继承下去,环境变量通过让所有的子进程继承的方式,实现自身的全局性

在之前我们讲过父子进程数据共享,而环境变量也是属于进程的数据的,所以我们也可以不传参数来获取进程的环境变量,有一个全局的变量environ


上面这个本地变量,为什么能被echo打印,而不能被env打印?明明两个都是子进程,而本地变量不在环境变量中,所以子进程不应该能找到才对呀,那echo是怎么找到的?

其实Linux中的命令分为两个:

  • 常规命令,shell fork创建子进程,让子进程去执行
  • 内建命令,shell命令行的一个函数,当然可以直接读取shell内部定义的本地变量

而echo\export等就是内建命令,所以即使PATH="",它们也能执行 

和环境变量有关的命令

1. echo: 显示某个环境变量值
2. export: 设置一个新的环境变量
3. env: 显示所有环境变量
4. unset: 清除环境变量和本地变量
5. set: 显示本地定义的shell变量和环境变量

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

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

相关文章

YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA(多尺度空洞注意力)发表于今年的中科院一区(算是国内计算机领域的最高期刊了),其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是…

北海 - Rust与面向对象(三)

策略模式 上节说到,模板方法变化一下就能成策略模式,怎么变化的?且看策略模式典型案例: pub trait Fly {fn fly(&self); }pub trait Quack {fn quack($self); }/// 先以静多态的方式实现 /// 似 trait Fly Quack就是Duck&…

java调用GDAL实现栅格数据的重采样的一种方法

目录 1.关于重采样 1.1概念 1.2用途 1.3常见算法 2.关于GDAL 2.1GDAL中的重采样算法 3.实现重采样 3.1思路 3.2完整代码 3.3使用QGIS验证效果 1.关于重采样 1.1概念 重采样是以原始图像的像元值或者导出的值填充到新的图像的每个像元的的过程。 1.2用途 在地理信…

【MySQL学习笔记007】约束

1、概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类 注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。 2、约束…

文章标题(备注)

现在也裁员了吗?怎么感觉越来越垃圾 这个又是什么?真搞笑,我也没开隐私呀

生物神经网络衍生出的算法

一个生物神经网络的基本结构: 生物神经网络由大量神经元组成,这些神经元之间通过突触相互连接。神经元可以接收来自其他神经元的信号,并根据信号的强度和类型来调整自己的输出信号。这种神经元之间的相互连接和信号传递形成了生物神经网络的基…

记pbcms网站被攻击,很多标题被篡改(1)

记得定期打开网站看看哦! 被攻击后的网站异常表现:网页内容缺失或变更,页面布局破坏,按钮点击无效,...... 接着查看HTML、CSS、JS文件,发现嵌入了未知代码! 攻击1:index.html 或其他html模板页面的标题、关键词、描述被篡改(俗称,被挂马...),如下: 攻击2:在ht…

[原创][R语言]股票分析实战[4]:周级别涨幅趋势的相关性

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX QQ联系: 643439947 个人网站: 80x86汇编小站 https://www.x86asm.org 编程生涯: 2001年~至今[共22年] 职业生涯: 20年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、D…

<JavaEE> 协议格式 -- 传输层协议 UDP

目录 一、UDP协议格式长啥样? 二、端口号和IP地址 1)UDP协议中包含哪两个端口号? 2)有没有包含IP地址? 三、UDP报文长度 1)UDP报文长度最长多长? 2)UDP报文的组成&#xff1f…

相机内参标定理论篇------张正友标定法

一、为什么做相机标定? 标定是为了得到相机坐标系下的点和图像像素点的映射关系,为摄影几何、计算机视觉等应用做准备。 二、为什么需要张正友标定法? 张正友标定法使手工标定相机成为可能,使相机标定不再需要精密的设备帮助。…

嵌入式开发——DMA外设到内存

学习目标 加强理解DMA数据传输过程加强掌握DMA的初始化流程掌握DMA数据表查询理解源和目标的配置理解数据传输特点能够动态配置源数据学习内容 需求 uint8_t data; 串口接收(&data);data有数据了 实现串口的数据接收,要求采用dma的方式。 数据交互流程 CPU配置好DMA外…

java数据结构与算法刷题-----LeetCode167:两数之和 II - 输入有序数组

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 思路 题目要求我们找到两个数相加的和,等于target指定的值。而…

设计模式--职责链模式

实验15:职责链模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解职责链模式的动机,掌握该模式的结构; 2、能够利用职责链模式解决实际问题。 [实验任务]:财务审批 某物资管理系统…

4. java——多态(java巅峰设计,超越了C++的理解,取其精华,去其糟粕)

多态指的是同—个行为具有多个不同表现形式 。是指—个类实例(对象)的相同方法在不同情形下具有 不同表现形式。封装和继承是多态的基础,也就是说,多态只是—种表现形式而已。一个对象,同一个方法不同形态,方法必须重…

reactor的原理与实现

网络模型 前情回顾服务器模型 Reactor和 ProactorReactor模型Proactor模型同步I/O模拟Poractor模型Libevent,libev,libuv优先级事件循环线程安全 前情回顾 网络IO,会涉及到两个系统对象:   一个是用户空间调用的进程或线程   …

基于IPP-FFT的线性调频Z(Chirp-Z,CZT)的C++类库封装并导出为dll(固定接口支持更新)

上一篇分析了三种不同导出C++类方法的优缺点,同时也讲了如何基于IPP库将FFT函数封装为C++类库,并导出为支持更新的dll库供他人调用。 在此基础上,结合前面的CZT的原理及代码实现,可以很容易将CZT变换也封装为C++类库并导出为dll,关于CZT的原理和实现,如有问题请参考: …

增量式旋转编码器在STM32平台上的应用

背景 旋钮是仪器仪表上一种常见的输入设备,它的内部是一个旋转编码器,知乎上的这篇科普文章对其工作原理做了深入浅出的介绍。 我们公司的功率分析仪的前面板也用到了该类设备,最近前面板的MCU从MSP430切换成了STM32,因此我要将…

STM32F407-14.3.10-表73具有有断路功能的互补通道OCx和OCxN的输出控制位-1x111

如上表所示,MOE1,OSSR1,CCxE1,CCxNE1时,OCx与OCxN对应端口的输出状态取决于OCx_REF与极性选择(CCxP,CCxNP) 死区。 -------------------------------------------------------------…

Python学习路线 - Python语言基础入门 - Python基础综合案例 - 数据可视化 - 动态柱状图

Python学习路线 - Python语言基础入门 - Python基础综合案例 - 数据可视化 - 动态柱状图 基础柱状图构建案例效果通过Bar构建基础柱状图反转x和y轴数值标签在右侧 基础时间线柱状图绘制创建时间线创建时间线自动播放时间线设置主题 动态GDP柱状图绘制需求分析列表的sort方法带名…

【SD】差异值 生成 同一人物 制作 表情包 【1】

说明:只对AI生成的人物,效果稳定。 Reference差异值 生成表情 首先生成一张图片。 测试命令:1 man,chibi,full body, 模型:envyclarityxl02_v10.safetensors [f6c13197db] 种子:2704867166 》》测试命令&#xff1a…