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

一、命令行参数

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变量和环境变量

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

干货//可以翻页的电子画册制作方法

想象一下,你是一位新晋的时尚品牌设计师,想要向全球展示你的设计理念和产品。传统的纸质画册虽然精美,但无法满足现代人对便捷性和互动性的需求。那么,如何解决这个问题呢? 现在,你可以使用翻页电子画册的制…

正则表达式:元字符

一、什么事元字符 正则是由一系列的元字符组成的,所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符,元字符是构成正则表达式的基本元件。 二、元字符的分类 1.特殊单字符 效果: ①.任意字符(换行符除外)&…

51单片机相关寄存器

前言 单片机复习的时候对应寄存器的记忆感觉很混乱,这里进行一下整理,后面的单词是我用来辅助记忆的,可能并不是表示原本的含义。 P3口的第二功能 0RXD 串行数据输入口 1TXD串行数据输出口2INT0外部中断0输入3INT1外部中断1输入4T0定时器0外部计数输入…

spring之资源操作:Resources

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某技术知识点… 一个人摸索学习很难坚持,想组团高效学习… 想写博客但无从下手,急需…

等级保护的基本要求(一)

目录 等级保护的标准定位 其他标准的关系 标准适用范围 标准编写思路 描述模型 基于安全保护能力 能力目标 第一级安全保护能力 第二级安全保护能力 第三级安全保护能力 第四级安全保护能力 描述模型-管理要求特点 描述模型-覆盖范围特点 等级保护的标准…

【汇编先导】-- 2

汇编先导 6. 寄存器 存储数据:CPU > 内存 > 硬盘(固态、机械) CPU还可分为: 32位CPU 8 16 32 64位CPU 8 16 32 64(增加了寻址能力) 通用寄存器 # 32位的通用寄存器只有8个 # 可以在任意软件的底层看到 # 通用寄存器可以存储任何值存值的范围…

ES6-11

一、ES6 js的异步和同步,js是单线程语言: 同步:加入主线程,按顺序执行,即上一个同步任务结束后,本任务跟着执行。 异步:加入任务队列,等待主线程上任务都执行完毕,请求主…

Ubuntu 常用命令之 date 命令用法介绍

📑Linux/Ubuntu 常用命令归类整理 date命令在Ubuntu系统中用于显示或设置系统的日期和时间。 date常见的参数 -d, --dateSTRING:显示STRING指定的时间,而不是当前时间。-u, --utc, --universal:显示或设置协调世界时间。-R, --…

《C++避坑神器·二十五》简单搞懂json文件的读写之遍历json文件读写

json.hpp库放在文章末尾 1、遍历json文件读写 (1)插入新键值对到json之情形1 原来json文件如下所示: {"Connection": {"IpAddress": "192.168.20.1","Rock": 0,"Solt": 1}, "Data…

【Java注解的作用是什么?】

🍁Java注解的作用是什么? 🍁典型解析🍁扩展知识仓🍁什么是元注解🍁Retention🍁Target🍁Documented🍁Inherited 🍁典型解析 Java 注解用于为 Java 代码提供元数…

W5500-EVB-Pico评估版介绍

文章目录 1 概述2 板载资源2.1 硬件规格2.2 硬件规格2.3 工作条件 3 参考资料3.2 原理图3.3 尺寸图 (单位 : mm)3.4 参考例程 4 硬件协议栈优势 1 概述 W5500-EVB-Pico是基于树莓派RP2040和完全硬连线TCP/IP控制器W5500的微控制器开发板-基本上与树莓派Pico板相同,但…

博客摘录「 Apollo安装和基本使用」2023年11月27日

常见配置中心对比 Spring Cloud Config: https://github.com/spring-cloud/spring-cloud-configApollo: https://github.com/ctripcorp/apolloNacos: https://github.com/alibaba/nacos 对比项目/配置中心 spring cloud config apollo nacos(重点) 开源时间 2014.9 2016…

逻辑运算加法器

前言 逻辑门本质上操作的是单个二进制数,通过高低电压或者有无信号来表示,并且,因为二进制数的原因,一个数字,我们可以通过二进制数来表示,整数可以精确表示,浮点数可以近似表示 本篇文章使用逻…

【前端查漏补缺】每日10题 2023-12-25

1. 实现lodash _get方法 _.get 是 Lodash 库中的一个方法,用于按照给定的路径从对象中获取值。它是一种安全的方式,可以避免在获取嵌套属性时出现的空指针错误。 _.get 方法的语法如下: _.get(object, path, [defaultValue])参数说明&…

python dash call_back 多output 7

效果 代码 # 导入Dash库及其相关组件,用于构建交互式Web应用 from dash import Dash, dcc, html, Input, Output, callback# 定义一个外部样式表,用于美化应用界面 external_stylesheets [https://codepen.io/chriddyp/pen/bWLwgP.css]# 创建一个D…

Jupyter Notebook的安装及在网页端和VScode中使用教程(详细图文教程)

目录 一、Jupyter Notebook1.1 组成组件1.2 优点1.3 常规用途 二、安装及使用2.1 网页端2.1.1 安装Jupyter Notebook2.1.2 检验是否安装成功2.1.3 启动Jupyter Notebook2.1.4 使用Jupyter Notebook 2.2 VScode中安装及使用2.2.1 安装Jupyter2.2.2 使用Jupyter 三、常用命令3.1 …

有没有简单好用的仓库管理系统?

“我是一家小型加工制造企业,希望使用一款免费的仓库管理软件管理下仓库物资,要上手比较快,有各类报表统计功能!同时有客服人员可以答疑。PS:最好有配套APP就最方便了。” 稍微总结一下仓库管理系统的需求—— 免费的仓…

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问

开源自托管导航页配置服务Dashy本地搭建结合内网穿透远程访问 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 简介 Dashy 是一个开源的自托管的导航页配置服务,具有易于使用的可视化编辑器、状态检查、小工具和主题等功能。你可以将自己常用的一…

220v电源转换12v和24v用什么芯片

问:将220V电源转换为12V和24V - 使用什么芯片? 答:常用于将220V电源转换为12V和24V的芯片是AH8669和AH8665。 问:AH8669芯片提供了什么特点? 答:AH8669芯片适用于最大电流为700mA的应用。它内置了MOSFET…

Text2SQL学习整理(五)将Text-to-SQL任务与基本语言模型结合

导语 上篇博客:Text2SQL学习整理(四)将预训练语言模型引入WikiSQL任务简要介绍了两个借助预训练语言模型BERT来解决WIkiSQL数据集挑战的方法:SQLOVA和X-SQL模型。其中,借助预训练语言模型的强大表示能力,S…