🌟 各位看官好,我是egoist2023!

🌍 Linux == Linux is not Unix !

🚀 今天来学习命令行参数与环境变量的相关知识。

👍 如果觉得这篇文章有帮助,欢迎您一键三连,分享给更多人哦!

目录

命令行参数

意义

环境变量

罗列Linux环境变量

PATH

OLDPWD

PWD

多方法获取环境变量

main函数获取

​编辑

getenv获取

environ获取

​编辑

我的进程如何获取环境变量 

环境变量全局属性

内建命令


命令行参数

main函数可以有参数吗?可以有几个参数呢?参数又是什么呢?带着这三个疑问往下阅读。

int main(int argc,char *argv[])
{printf("hello linux!\n");return 0;
}

我们或多或少在别人的程序中见过这种代码,清楚main函数是可以带参数的,并且可以有两个参数(实际上可以有3个参数,第3个是环境变量表)。那么这两个参数各代表什么含义呢?

  • argv是一个指针数组,它指向一个一个的字符串,最后以NULL结尾;
  • argc用来记录argv[]的元素个数。

我们的命令行参数会放到命令行参数表上,即argv,它用来存储命令行参数的每个单独的字符串。


意义

为什么要有命令行参数表呢?它能带来的意义又有哪些呢?

  1. 命令行参数传递:借助主函数的参数,能把命令行中用户输入的参数传递到程序内部,这样程序就能依据不同参数执行不同操作。
  2. 程序灵活性提升:无需对代码进行修改,通过命令行参数就能改变程序的运行方式或者配置信息。

从这两方面我们并不能体会到啊?因此小编写了段程序解释命令行参数带来的意义:

下图中写了一段程序,它借助main函数参数,让命令行参数传递的时候,通过匹配不同的命令行参数,如果第二个参数带的是v1则实现v1版本,带的是v2则实现v2版本,从而实现不同版本的逻辑,这带来的意义就是命令行参数传递实现不同的逻辑,同时我们也可以限制如果传递的命令行参数不符合我们的逻辑,则不能通过,提升了程序灵活性。

 💻如图实现: 

有没有一种可能我们之前所说的选项就是这样实现的呢?

是的没有错,Linux中许多指令也是借助了命令行参数才得以支持多模块实现,如ls指令。

ls -l -a -i

 ls的命令本质是一个程序,而我们之前说ls后面的是选项,今天我们对选项能有更深的理解,它是通过命令行参数匹配从而实现我们的目的。

-l 、 -a 本质是字符串,以一定的方式传递给ls内部的"main",在ls内部实现的时候,就可以根据不同的选项,实现类似功能的不同表现形式。

因此我们对指令又有了进一步的理解:指令是特定目录上执行的二进制程序,而选项则是根据不同的参数传递给"main",实现不同表现形式.


环境变量

引出概念:

  • 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪⾥,但是照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量是系统级别的一些全局变量,具备不同的用途(这也是为什么要有环境变量的原因)。

罗列Linux环境变量

那么该如何查看环境变量呢?

env 可以用来查看环境变量 , 这里主要讲三个重要的环境变量:PATH、OLDPWD、PWD.

  

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

PATH

我们前面说过,指令也是一个可执行程序。为什么有些指令可以直接执⾏,不需要带路径,⽽我们自己的⼆进制程序需要带路径才能执行啊( 否则会报找不到 )这是为什么呢?

通过which命令查看ls所处的路径,可以看到是在/usr/bin的路径下。 什么意思呢 ? 即OS要执行该指令时,就需要/usr/bin路径,那么由谁给它提供呢 ? OS默认会在PATH路径下查找,若没有则会报错。而/usr/bin被包含在PATH环境变量中。

  1. 因此我只要证明 /usr/bin 不在PATH中时,此时再使用 ls 指令会向我们执行自己的程序一样报没有找到 ;
  2. 或者将我们自己的程序添加到PATH中,再执行自己的程序,若不会报错, 即可证明OS是在PATH中查找的。 

 

💻扩展:

PATH的环境变量改变了,该怎么进行复原呢?重启xshell即可,因为环境变量是内存级的。 

OLDPWD

OLDPWD环境变量用来记录当前用户最近一次所处路径。

💻证明: echo $OLDPWD可以展示最近一次所处路径.

  

PWD

这里总算可以解释pwd指令的原理了:

我们知道每个进程(包括xshell啊!)都会记录自己所处的工作路径,这在之前是已经验证过的.那么我们的PWD环境变量又从哪里而来呢? 

pwd 会读取 当前进程所处的cwd.

💻pwd指令原理:

当你在 shell 里输入 pwd,其实是启动了一个新的进程,它继承了父进程(你的 shell)的 cwd 。pwd 进程通过系统调用(如 getcwd())读取自己的 cwd,然后把它打印出来。由于 pwd 进程和你的 shell 进程的 cwd 是一样的,所以你看到的就是你当前 shell 所在的目录。


多方法获取环境变量

获取环境变量的方法有很多,这里主要介绍三种:

main函数获取

我们前面说了main函数是可以带3个参数的,而第3个参数则是环境变量表.下图中

💻模拟实现env指令:


getenv获取

getenv是C语言库提供的函数,它可以用来获取单个环境变量


environ获取

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时 要⽤
extern声明。(实际上environ就是个二级指针,指向环境变量表)


我的进程如何获取环境变量 

我们大部分的指令以及自己实现的可执行程序,都不是有bash帮我们执行的,而是bash通过创建子进程的方式,让子进程继承了bash的环境变量,形成环境变量表。

问题1:为什么子进程可以继承bash的环境变量?

环境变量表是数据吗?是数据,并且是父进程的数据。子进程通常会继承父进程的代码和数据为副本,因此可以继承bash的环境变量。

问题2:bash从哪里获得环境变量的?

bash从系统的配置文件中获取,先会malloc环境变量表,解析配置文件的内容,把环境变量字符串依次放入到环境变量表里。

那么这就意味着bash一定会有两张表:

命令行参数表(一直在变)+ 环境变量表(比较稳定,内存级)

💻验证:

我们可以更改配置文件的信息,写入一段echo "哈哈,这个配置文件被执行了" 。则每次启动xshell时,bash都会从这个配置文件中形成环境变量表,在显示器上打印我们写入的信息。

  

输出结论:bash获取环境变量有两方面:配置文件 + 动态形成。 

环境变量全局属性

  • echo:显示某个环境变量值
  • export: 设置⼀个新的环境变量
  • unset: 清除环境变量
  • set: 显⽰本地定义的shell变量和环境变量

环境变量是具有全局属性的,可以被子进程继承下去;

相对应的本地变量是不具备全局属性的,这种变量是不能被子进程继承。

💻下图中证明本地变量是不可以被子进程所继承的:

MYENV是本地变量,执行程序时bash创建子进程,子进程以父进程为副本进行继承,包括环境变量.假设本地2变量可以被继承下去,那么getenv获取该变量,如果打印该变量不存在说明本地变量是不能被继承下去的.

 

内建命令

我们知道命令是可执行程序,其中的大部分命令需要通过创建子进程的性质执行。

那么肯定也存在一些命令是不需要通过创建子进程来执行,而是由bash来执行.那么这个命令在执行的时候是没有风险的.我们把这种命令叫做内建命令!!! 

💻echo 指令: 无论是本地变量还是环境变量,echo都能显式变量值。

我们说本地变量是不能被子进程继承下来的,说 明本地变量只在bash自 身有效,如果能打印出该变量的值,恰恰说明echo指令是一个内建命令。  

  


 

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R 数据框:深入解析及其在数据分析中的应用

R 数据框:深入解析及其在数据分析中的应用 引言 R语言作为一种强大的统计计算和图形工具,在数据分析领域有着广泛的应用。数据框(DataFrame)是R语言中处理数据的一种重要结构,它类似于其他编程语言中的表格或关系数据库中的表。本文将深入解析R数据框的概念、特点、创建…

机器学习数据集划分全指南:train_test_split详解与实践

目录 一、为什么需要划分数据集? 二、train_test_split基础用法 2.1 最简单的划分方式 2.2 参数说明 三、实际应用案例:Iris数据集划分 四、高级技巧与注意事项 4.1 分层抽样(Stratified Sampling) 4.2 时间序列数据划分 …

python-77-数据序列化框架Avro数据格式编码和解析

文章目录 1 avro简介1.1 关键特点1.2 无需标记2 使用步骤2.1 定义Avro模式2.2 编码Avro数据2.3 解析Avro数据3 DataFileWriter和DataFileReader3.1 写入DataFileWriter3.2 读取DataFileReader3 文件中存储16进制字符串3.1 十六进制字符串3.2 代码示例4 接收kafka中的avro数据5 …

IAR携手矽力杰与普华基础软件,共推RISC-V车规芯片高安全应用落地

芯片 基础软件 开发工具三方协同,赋能国产汽车电子加速自主演进 在“软件定义汽车”持续重塑产业格局的当下,构建安全、高效、可扩展的本土汽车电子生态已成为行业共识。 IAR嵌入式开发解决方案现已全面支持矽力杰SA32B系列和即将量产的SA32D系列车规…

Vscode——报错,加载 Web 视图时出错: Error: Could not register service worker

Vscode——报错完整信息 加载 Web 视图时出错: Error: Could not register service worker: InvalidStateError: Failed to register a ServiceWorker: The document is in an invalid state… 很有意思下班前还是好的,上班发现下载的Ai code 无法正常使用了 解决…

Java-Collections、Map

目录 1.可变参数 2.Collections工具类 不同集合类型的排序方法比较 3.斗地主游戏 4.Map集合 4.1 Map集合概述 4.2 Map集合的常用方法 4.3 Map集合的遍历方式 4.4 Map集合案例—统计投票人数 4.5 HashMap 4.6 LinkedHashMap 4.7 TreeMap 5.集合的嵌套 1.可变参数 import …

开源界迎来重磅核弹!月之暗面开源了自家最新模型 K2

1. 模型简介 Kimi K2 是一款尖端专家混合(MoE)语言模型,激活参数量达320亿,总参数量突破1万亿。该模型采用Muon优化器训练,在前沿知识、推理和编程任务中展现出卓越性能,同时针对智能体能力进行了精细化优…

Grok-4 发布会图文总结

文章目录00:00 - Grok-4:以“全球最智能 AI”之名突破性登场06:41 - 推理能力的大幅飞跃:100 倍训练量铸就的“博士级”大脑13:25 - 工具使用能力的革新:从“原始”到深度整合20:06 - 直面强化学习的挑战与 AI 的终极测试26:45 - 应用演示&am…

AI产品经理面试宝典第1天:机器学习核心算法全景解析

面试官:请解释什么是监督学习?能否用生活案例说明其运作逻辑? 监督学习如同教孩子识字的过程。父母指着"苹果"图片反复说"这是苹果"(带标签的训练数据),孩子逐渐建立"红色圆形水果=苹果"的认知模型(算法生成)。当孩子看到新图片时,模型…

前端开发技术栈概览

前端开发技术栈概览 前端开发是创建Web页面或app等前端界面给用户的过程,从简单的静态页面到复杂的单页应用(SPA),前端技术栈经历了快速的演进。以下是前端开发所需掌握的核心技术分类及相关知识点: 1. 基础层:HTML、CSS、JavaScr…

详解Kafka通过幂等性实现分区消息不重复的机制

一、核心机制:PID与序列号1. Producer ID (PID)唯一标识:每个生产者实例启动时,由Kafka Broker分配一个全局唯一的PID,用于标识消息来源。持久化存储:PID由Broker持久化保存,确保生产者重启后仍能追踪历史状…

压缩包方式在centos7版本上安装mysql8.0

使用tar命令解压 tar -zxvf mysql-8.0.32-el7-x86_64.tar.gz -C /usr/local/到/usr/local/修改解压后的文件名为mysql 创建mysql用户组和用户,自己在mysql下面创建data目录存储信息,把权限交给mysql这个用户 groupadd mysql useradd -r -g mysql mysql c…

使用ansible给被管理节点安装docker

在跳板机上安装ansible,再通过ansible的playbook,给被管理节点安装docker。 跳板机配置 实验环境 华为云上按需开两台2核2G的Ubuntu的ECS;2台公网IP为5Mbit/s,按需按流量;2台服务器在一个子网内;跳板机和被管理节点主机分别挂不通的安全组 在…

《Java EE与中间件》实验三 基于Spring Boot框架的购物车

目 录 一、实验目的和要求 二、实验实现思路及步骤 1、实验思路 2、实验步骤 3、实验方案 三、主要开发工具 四、实验效果及实现代码 1、购物车数据库构建实现 (1)建立javaee-project数据库 (2)建立t_cart数据表 &…

DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 论文精读

题目:DAS3D: Dual-modality Anomaly Synthesis for 3D Anomaly Detection 题目:DAS3D:用于三维异常检测的双模态异常合成 论文地址:ECCVW 2024 2410 Dual-modality 双模态 Anomaly Synthesis 异常合成 for 3D Anomaly Detection…

EasyCVR视频汇聚平台国标接入设备TCP主动播放失败排查指南

部分客户现场的下级平台通过国标级联接入安防监控系统EasyCVR后,只能通过TCP主动的播放方式进行播放(并不是所有下级平台都支持tcp主动播放,模式需下级平台支持),但是有些平台刚接入的时候发现不能播放。核心原因分析&…

linux打包指令和移动指令

在Linux中,常用的文件夹打包命令是 tar,它可以将文件夹压缩打包成 .tar、.tar.gz、.tar.bz2 等格式的文件。以下是具体用法: 1. 基础打包(不压缩,生成 .tar 文件) 将文件夹 folder 打包为 folder.tar&#…

神经符号AI:结合深度学习和符号逻辑的下一代AI

神经符号AI:结合深度学习和符号逻辑的下一代AI当AI医生解释诊断时,它不仅能指出医学影像中的异常像素模式,还能引用临床指南中的第三条第二款,推演病理发展的逻辑链条——这正是神经符号AI赋予机器的“理性之光”。2025年初&#…

SpringBoot JWT

jsonwebtoken 引依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version></dependency> 测试一下&#xff0c;jwt是2个带逗号的3段字符串 官网参考&#xff1a;JSON …

读取QPS 10万,写入QPS 1000,如何设计系统架构?

你是否也曾深陷在臃肿的领域模型&#xff08;Domain Model&#xff09;的泥潭&#xff0c;一个 User 或 Order 实体类&#xff0c;既要处理复杂的业务逻辑和数据校验&#xff0c;又要承载各种为前端展示而生的DTO转换&#xff0c;导致模型越来越胖&#xff0c;读写性能相互掣肘…