【Linux】命令行参数和环境变量

news2024/10/5 16:31:12

命令行参数

其实main函数是可以传参数的,也叫做命令行参数。我们这里先介绍main函数的前两个参数

argc代表的是指针数组的元素个数,argv是一个指针数组,指针指向字符串。argv不可能为空,argv【0】存储该进程的名字

例如 ls -a -l   那么argv就会存储ls,-a,-l,以空格为分隔符,argc则为3

然后main函数可以通过字符串来进行映射分流,实现不同的功能

命令行参数是让系统函数存在选项的重要概念

我们也终于理解历史学的指令和选项是什么关系了   (指令里面含有main函数,将选项作为字符串传参,然后进行映射分流)

环境变量

学完上面的命令行参数后,我们发现在执行自己实现的指令的时候往往要加上./,而系统里的指令却不用,直接输入名字就好了,这是为什么呢?这里就和我们的环境变量有关系了

要加上./是因为要让系统在当前目录中去寻找这个文件,不然的话系统找不到

而系统的指令默认是在$PATH这个环境变量中去寻找的

那么$PATH具体是什么呢?我们可以通过echo查看一下——echo $环境变量名

可以看到本质上就是存储了一个个路径,以:为分隔符隔开

除了PATH这个环境变量,系统中还有其他大量的环境变量

例如 HOME——查看自己的家目录

        SHELL——查看当前SHELL

每个环境变量都有自己的特定功能,任何进程在启动的时候都会获得命令行变量表和环境变量表

环境变量是以什么形式存储的?

本质上环境变量都为一个个字符串,所以我们用指针数组存储他们首元素的地址,就能找到对应的环境变量了,所以环境变量表本质上就是一个指针数组

父子进程的环境变量从哪来?

首先我们知道bash进程上的命令行(名义上的父进程)都是bash的子程序,子进程的命令行参数和环境变量都由父进程bash传递

那我们的bash是如何在启动的时候就知道环境变量的呢?

其实环境变量都存储在相关的配置文件中,bash启动的时候就会读取配置文件然后形成相关的环境变量表

每个进程都有自己的环境变量吗,还是他们共享一份?

父进程创建子进程的时候,会拷贝一份环境变量表给子进程,并将一些需要修改的信息进行修改(例如当前路径,用户名等),这样就实现了环境变量的全局性。所以每个进程都有自己的环境变量,而不是独享一份

查看环境变量的三种方法

1.通过main函数的第三个参数

#include<stdio.h>
int main(int argc,char* argv[],char* env[])
{
    //argc : 命令行参数的个数, 本质上就是argv数组的元素个数
    //argv :具体的命令行参数
    // envp : 环境变量的值
    for(int i=0;i<argc;i++)
    {
        printf("%s\n",argv[i]);
    }
    for(int i=0;env[i]!=NULL;i++)
    {
        printf("%s\n",env[i]);
    }
    return 0;
}

2.通过第三方变量environ获取

#include<stdio.h>
int main(int argc,char* argv[])
{
    extern char** environ;
    for(int i=0;environ[i]!=NULL;i++)
    {
        printf("%s\n",environ[i]);
    }
    return 0;
}

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明 

3.通过getenv()或者putenv()来访问特定的环境变量

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
    printf("%s\n",getenv("PATH"));
    return 0;
}

关于环境变量的一些指令

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

 这里看到可以用export设置新的环境变量,但是我们设置完后关掉shell再打开就会失效了,这是为什么呢?

原因是这里export的只是一个本地变量,不会被继承,只存在当前进程中,而我们的环境变量本质上是去配置文件中读取然后形成的,所以关掉后本地变量会消失,而环境变量却依然可以使用

如果真要修改环境变量,就要去修改相关的配置文件

当PATH被设置为空的时候,为什么echo却能访问进程的本地变量呢?

linux的两种命令

1.常规命令:在磁盘中真实存在的,需要shell fork让子进程执行的——诸如ls,pwd...

2.内建命令:shell命令行的一个函数,当然可以访问shell的本地变量

常规命令需要shell创建子进程并去PATH中获取,但是此时PATH为空

echo则是shell的一个函数,可以理解为父进程的函数,可以直接执行

———————————————————————————————————————————

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

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

相关文章

【数据结构】830+848真题易错题汇总(10-23)

【数据结构】830848易错题汇总(10-23) 文章目录 【数据结构】830848易错题汇总(10-23)选择题填空题判断题简答题&#xff1a;应用题&#xff1a;算法填空题&#xff1a;算法设计题&#xff1a;(待补) 选择题 1、顺序栈 S 的 Pop(S, e)操作弹出元素 e&#xff0c;则下列(C )是正…

在 Python 中使用 Pillow 进行图像处理【2/4】

第二部分 一、说明 该文是《在 Python 中使用 Pillow 进行图像处理》的第二部分&#xff0c;主要介绍pil库进行一般性处理&#xff1a;如&#xff1a;图像卷积、钝化、锐化、阈值分割。 二、在 Python 中使用 Pillow 进行图像处理 您已经学习了如何裁剪和旋转图像、调整图像大…

Yakit工具篇:专项漏洞检测的配置和使用

简介&#xff08;来自官方文档&#xff09; 专项漏洞检测是针对特定应用程序或系统进行的安全漏洞扫描技术&#xff0c;旨在检测与该应用程序或系统相关的安全漏洞。 Yakit通过对常见的中间件、CMS、框架、组件进行总结、归纳&#xff0c;并针对这些组件对其常见的高危漏洞进…

027-第三代软件开发_ComboBox

第三代软件开发_ComboBox 文章目录 第三代软件开发_ComboBox项目介绍ComboBox实际使用 关键字&#xff1a; Qt、 Qml、 ComboBox、 delegate、 Connections 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&…

试题一 (软件设计师笔记)(15分)

&#x1f600;前言 现在就是总复习试题一 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609; 在csdn获奖荣誉: &#x1f3c6;csd…

记录打包部署Springboot项目到Windows环境

Springboot项目开发完成后要做的工作就是部署了&#xff0c;这里记录下打包部署的过程。这个项目是一个SpringBoot多模块项目&#xff0c;包含了一个父工程&#xff0c;一个子模块和一个工具模块。其中子模块里有启动类&#xff0c;而工具模块没有。因此这三者的pom文件不一样。…

SOME/IP, DDS 还是 MQTT

如今&#xff0c;用户希望将他们的汽车根据个人偏好进行定制&#xff0c;通过添加功能并定期进行更新&#xff0c;就像他们对待移动设备一样。实现这些期望属性的一个构建模块是基于 Internet Protocol&#xff08;IP&#xff09;的通信&#xff1b;IP为新的设计模式打开了大门…

arcgis js api 4.x加载geoserver发布的地方坐标系(自定义坐标系)的wms服务

问题描述&#xff1a;之前研究过arcgis js api 4.x加载arcgis server 发布的地方坐标系的wms服务&#xff0c;后来研究出来能正常加载了&#xff0c;想了解的可以看我之前的博客。但是一直困于加载geoserver发布的地方坐标系的wms服务&#xff0c;一直都是用的WMSLayer这个调用…

1024渗透OpenVas扫描工具使用(第十四课)

1024渗透扫描工具使用(第十四课) 一 漏洞披露 1 微软安全更新指南&#xff08;自2017年2月起&#xff0c;替代安全公告&#xff09; 安全公告都有一个惟一的编号 其命名规则是&#xff1a;MS年份-补丁序号 或 CVE-年份-补丁序号 比如MS17-010就表示2017年发布的编号为010的安…

自然语言处理---Transformer构建语言模型

语言模型概述 以一个符合语言规律的序列为输入&#xff0c;模型将利用序列间关系等特征&#xff0c;输出一个在所有词汇上的概率分布&#xff0c;这样的模型称为语言模型。 # 语言模型的训练语料一般来自于文章&#xff0c;对应的源文本和目标文本形如: src1 "I can do&…

【剑指Offer】34.二叉树中和为某一值的路径(二)

题目 输入一颗二叉树的根节点root和一个整数expectNumber&#xff0c;找出二叉树中结点值的和为expectNumber的所有路径。 1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点 2.叶子节点是指没有子节点的节点 3.路径只能从父节点到子节点&#xff0c;不能从…

运维:mysql常用的服务器状态命令

目录 1、查询当前服务器运行的进程 2、查询最大链接数 3、查询当前链接数 4、展示当前正在执行的sql语句 5、查询当前MySQL当中记录的慢查询条数 6、展示Mysql服务器从启动到现在持续运行的时间 7、查询数据库存储占用情况 8、查询服务器启动以来的执行查询的总次数 9…

算法通关村第十关黄金挑战——归并排序详解

大家好&#xff0c;我是怒码少年小码。 归并排序 就是将一个大的序列分为多个小的序列&#xff0c;对小的序列排序&#xff0c;最后利用归并的思想合并序列。归并排序的思想就是分而治之。 分&#xff1a;将大序列分为很多个小的序列 治&#xff1a;将多个小的序列合并为大序…

用 pytorch 训练端对端验证码识别神经网络并进行 C++ 移植

文章目录 前言安装安装 pytorch安装 libtorch安装 opencv&#xff08;C&#xff09; 准备数据集获取训练数据下载标定 编码预分析 数据集封装格式 神经网络搭建神经网络训练神经网络测试神经网络预测C 移植模型转换通过跟踪转换为 Torch Script通过注解转换为 Torch Script 编写…

解决 Element-ui中 表格(Table)使用 v-if 条件控制列显隐时数据展示错乱的问题

本文 Element-ui 版本 2.x 问题 在 el-table-column 上需根据不同 v-if 条件来控制列显隐时&#xff0c;就会出现列数据展示错乱的情况&#xff08;要么 A 列的数据显示在 B 列上&#xff0c;或者后端返回有数据的但是显示的为空&#xff09;&#xff0c;如下所示。 <tem…

Python教程(15)——Python流程控制语句详解

目录 if语句else if语句for循环遍历类型range关键字 while循环break语句continue语句 Python流程控制是Python编程中非常重要的一部分&#xff0c;它用于控制程序的执行流程。Python提供了多种流程控制语句&#xff0c;包括if语句、while循环、for循环、break和continue语句等。…

[翻译]理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要

理解Postgres的IOPS&#xff1a;为什么数据即使都在内存&#xff0c;IOPS也非常重要 磁盘IOPS&#xff08;每秒输入/输出操作数&#xff09;是衡量磁盘系统性能的关键指标。代表每秒可以执行的读写操作数量。对于严重依赖于磁盘访问的PG来说&#xff0c;了解和优化磁盘IOPS对实…

使用QT实现http里面的get和post

#1024程序员节&#xff5c;参与投稿&#xff0c;赢限定勋章和专属大奖# #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# #你被什么样的BUG困扰过一周以上&#xff1f;# 在http里面下面这些方法和服务器的响应代码一起用于HTTP协议中的请求和响应交互。请注意&…

模板再认识

在前面的文章中我写了关于模板的一些简单的认识&#xff0c;现在我们来再次认识模板文章目录 1.非类型模板参数2.模板特化1). 模板特化的写法2). 类模板特化3). 函数模板特化4). 模板全/偏特化 3.模板分离编译 1.非类型模板参数 在模板中还有一种是非类型的模板参数。我们代码…

【数组拷贝+二维数组遍历】

文章目录 前言数组的拷贝第一种方式&#xff1a;第二种方式:利用工具类拷贝 二维数组二维数组的三种定义打印二维数组的某个元素遍历二维数组 二维数组的每个元素是一维数组遍历二维数组&#xff08;优化&#xff09;打印出一个数组&#xff08;不是数组元素&#xff09;的方法…