环境变量,本地变量,命令行参数和内建命令

环境变量相关指令

        系统指令能够直接执行,自己编写好经过编译的程序需要加上前缀./才能运行,原因是在系统的一个名叫PATH的全局变量中存放了系统指令所在的路径:

        在当前路径下有一个编译好的可执行程序,command,将该程序的路径加入到PATH环境变量中,也可以像系统指令一样,不需要加./前缀就可以直接运行: 

         PATH=$PATH:【要添加的内容】

        添加好后自己编译的程序可以直接运行:

         要查看系统中所有的环境变量用env指令:

 HOME记录用户的家目录

HISTSIZE用于记录终端要保留的历史指令条数

SSH_TTY记录当前终端设备所在的路径。你可以打开另一个终端,向这个路径输出一些内容,他会在相应的终端中显示:

        

 LOGNAME记录当前登录的用户是谁

OLDPWD保存你上次所在的路径位置,cd - 指令能够直接回到上次所在的路径原因就在于系统变量保存了该路径。当你登录上shell后第一条指令执行cd -,就会提示你OLDPWD notset。

        你的代码程序需要获取环境变量时,可以通过系统调用:

 

        其次,C语言可以通过声明外部变量 enviroment来获取环境变量:

        向环境变量中新增一个变量用export:

        

        取消一个环境变量用unset:

命令行参数

        main()函数允许有指定的形参,int argc,char* argv[ ] ,用于保存程序运行时的的自定义选项:
        

        我们输入指令实际上是给系统输入了一串字符串,系统将该字符串以空格作为分割,来执行相应的程序,argc保存命令行参数字符串的个数,argv指针数组,一个向量表,保存命令行参数的内容:

        就像系统指令,ls -a ,ls -l等等,一样的程序可以执行不同的功能。main函数带参实际上就是为指令,软件,工具的使用提供选项支持。

        大多数的教材没有说main函数的第三个参数,char* env[ ],同样是一个数组指针或者叫做向量表,用来指向系统的环境变量:

通过三个main函数参数我们可以感知到,一个程序要变成进程,肯定是被别的程序调用并且进行传参。

还要指出一点,子进程是可以继承父进程的环境变量。我们在终端中运行的程序都是bash的子进程,bash在启动时,会从操作系统的配置文件中读取环境变量。

本地变量

        shell本身就是一个c程序,本地变量相当于在main中定义的一些局部变量,用set查看shell中的环境变量和本地变量:

        拿PS1='[\u@\h \W]\$ ',PS2='> '两个说,两个本地变量定义了shell显示命令行的格式,\u表示用户名,\h表示主机名,\W表示当前工作空间,也就是这个东西:

        PS2是一个续航提示符,完整的指令可以用 \ 间断,来到下一行继续输入,PS2就是提示符:

        shell程序本身的运行需要定义一些本地变量,这些变量只在shell的内部有效,不会被子进程继承。

        接下来我们在环境变量和本地变量的基础上引出内建命令的概念,从一个问题出发。

内建命令

        我们新建一个本地变量MY_VALUE,写一个程序用来查看它的值,然后再用echo查看它的值:

        我们编写的mycommand指令使用getenv系统调用查看不到本地变量,用echo却查看到了,这就说明,mycommand是shell的一个子进程,echo执行没有创建新的进程。

        shell的程序逻辑是,通过while循环捕捉用户输入,然后对用户输入的字符串进行解析处理,通过if判断输入的第一个字符串,也就是我们指令名,有些指令执行需要调用其他程序,那么就调用fork()创建一个新进程,在子进程中进行进程替换来完成相应指令功能的执行。而有些指令是一些简单的功能,就比如echo,这个时候我们选择在shell本进程中编写相应的功能而不创建新的进程调用其他的程序,这类的指令就叫做内建命令。

        总结:环境变量是一个进程运行时继承自父进程或者读取自操作系统配置文件一些全局变量,内容包含程序执行时极为重要的信息,有的用来记录当前程序执行的工作路径,有的用来识别用户身份来进行权限认定,有的来设置用户登录时的默认目录,有的来设置记录历史指令的条数。

        env查看当前系统的环境变量,set可以查看当前shell的本地变量和环境变量,echo $环境变量名,查看单一的环境变量值,export 用于将一个本地变量导出为环境变量,环境变量 = 环境变量:【新增内容】来覆盖式的修改环境变量值,unset用来取消环境变量的设置。

        main()的三个形参的主要用途是为指令或者一些软件工具提供命令行参数的支持。

        shell的常规命令通过新建进程来执行,一些命令诸如cd,echo作用在shell本身的或者简单的指令,无需创建进程而是在shell主程序中调用函数或者实现功能的指令被叫做内建命令。

        

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

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

相关文章

普中51单片机学习(定时器和计数器)

定时器和计数器 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。51单片机中的定时器/计数器是…

手撕C语言习题

定义一个表示公交线路的结构体,要求有线路名称(例如 616),起始站,终点站,里程等成员, 定义结构体数组,用来存储多条条公交线路信息,要求能够输出从指定起始站发车的所以公交线路信息。 2、定义…

算法与数据结构

算法与数据结构 前言 什么是算法和数据结构? 你可能会在一些教材上看到这句话: 程序 算法 数据结构 算法(Algorithm):是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代…

vue3 之 商城项目—会员中心

整体功能梳理 1️⃣个人中心—个人信息和猜你喜欢数据渲染 2️⃣我的订单—各种状态下的订单列表展示 路由配置&#xff08;三级路由配置&#xff09; 准备模版member/index.vue <script setup> </script><template><div class"container">…

有方机器人 STM32智能小车 项目学习笔记1

今天开始学习有方机器人--智能小车项目&#xff0c;正点原子部分的学习先放一放&#xff0c;还是小车更有吸引力哈哈。 新建工程及工程模板搭建 新建工程须知 目前常用的 STM32 的开发方式主要有基于寄存器编程、基于标准库函数编程、基于 HAL 库编程这三种。 寄存器版本--…

提升Teams体验:SDWAN解决登录问题的有效方案

在国内&#xff0c;Microsoft Teams已经成为一种备受欢迎的团队协作工具。然而&#xff0c;有时用户在试图登录Teams时可能会遇到登录问题&#xff0c;这给办公效率带来了一些困扰。在国内办公环境中&#xff0c;可以借助云桥通SDWAN企业组网加速服务来解决Teams登录问题&#…

猫头虎分享已解决Bug || 脚本执行错误(Script Execution Failure):ScriptError, ExecutionFailure

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

【 buuctf--ezmisc】

下载&#xff0c;解压后发现是一张图片 看到 png 图片首先就是 binwalk 看一下有什么隐藏信息&#xff0c;exiftool 看一下图片简介&#xff0c;stegsolve 看看存不存在隐写等&#xff0c;事实就是都看了一个变没发现有什么线索&#xff0c;然后放到 010editor 里面看一下 就会…

MySQL Replication

0 序言 MySQL Replication 是 MySQL 中的一个功能&#xff0c;允许从一个 MySQL 数据库服务器&#xff08;称为主服务器或 master&#xff09;复制数据和数据库结构到另一个服务器&#xff08;称为从服务器或 slave&#xff09;。这种复制是异步的&#xff0c;意味着从服务器不…

Window系统GPT-SoVITS配置安装

GPT-SoVITS配置安装 GPT-SoVITS配置Python下载以及安装源文件安装依赖 运行整理在安装配置环境时遇到的报错总结 GPT-SoVITS配置 作者链接 Python下载以及安装 版本这里根据教程的版本走即可&#xff0c;这里不会安装python或者不会配置环境的参考我之前的文章 Python 3.9,…

【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

数据结构:跳表讲解

跳表 1.什么是跳表-skiplist1.1简介1.2设计思路 2.跳表的效率分析3.跳表实现3.1类成员设计3.2查找3.3插入3.4删除3.5完整代码 4.skiplist跟平衡搜索树和哈希表的对比 1.什么是跳表-skiplist 1.1简介 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&…