环境变量?拿来把你!

news2024/10/6 8:27:23

image-20230102195615529

文章目录

  • 环境变量
        • 直接运行程序的第一种方法:把程序移动到系统目录底下
        • echo $环境变量:查看环境变量
        • PATH:指定命令的搜索路径
        • export 定义一个新的环境变量
          • export PATH=旧路径:新路径
        • getenv:获取环境变量—获取环境变量的第一种方式
        • set查看本地定义的shell变量和环境变量
        • unset 取消(清除)环境变量或者本地变量
  • 浅谈命令行参数
        • 获取环境变量的第二种方式:char* env【】
        • 获取环境变量的第三种方式extern char **environ

环境变量

在这里我先写一个小程序,不间断打印程序pid

image-20230102105638713

然后./程序名运行它

image-20230102105646600

到这里我想为什么我写的程序要在前面加上./即相对路径或者绝对路径才能运行,而Linux自带的指令直接输入就能跑?比如我直接输入ls,ll,但是直接输入我写的程序名就不能跑,原因是没找到该指令。。。??

image-20230102105905373

我用which指令搜索,发现能直接通过输入指令名而运行的指令有个共同点,他们都放在/usr/bin/目录底下,而我写的程序则不在。有没有可能在/usr/bin/目录底下的程序就能直接通过输入程序名就能直接跑起来呢?

image-20230102110140567

直接运行程序的第一种方法:把程序移动到系统目录底下

于是乎,我把我写的myprocess程序拷贝到/usr/bin/目录底下,然后直接输入程序名,发现可以运行!

image-20230102110445619

但是我不建议把自己写的程序移动到系统目录下,因为我们写的程序大多数没有经过测试,直接移入系统会污染系统指令池!

为了避免污染系统指令池,用sudo rm删掉刚刚移入的指令

image-20230102110823688

那是为什么把程序移动到/usr/bin/目录底下就能直接运行呢?这时候需要借助一个名词:环境变量来解释

那么什么是环境变量呢?

1.环境变量是指操作系统为了满足不同的应用场景,在登录时就准备好的一大批全局变量。

2.环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

3.环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

echo $环境变量:查看环境变量

PATH:指定命令的搜索路径

因为有个环境变量PATH,在我们输入某个程序名时,它会帮我们在下面显示的路径底下搜索该程序,路径和路径之间用冒号段开。找到了则运行,没找到则反馈没找到;

该PATH在shell下是全局有效的,所以要加$才能查看

image-20230102111928296

那怎么配置呢?

export 定义一个新的环境变量

如果像图片export PATH=某个路径那样配置,那么之前的那些所有指令都不适用了,PATH只会在你给的路径下查找。如果这样设置了也没关系,因为这是内存级的环境变量,这时我们退出xshell重进就会恢复原来的配置。

image-20230102120407962

export PATH=旧路径:新路径

通过配置旧路径:新路径的方式配置环境变量PATH,把我们的新路径添加进环境变量里;这时候可以通过echo查看到我们新配置的路径,which查看我们的程序(指令),而且可以直接运行我们的程序,并且不会影响系统原来的指令使用!即直接运行程序的第二种方法:把程序所在目录添加到环境变量中

image-20230102122708094

那为啥刚刚配置错了PATH,重启xshell后又重新配置好了呢?

我们 cd~进到当前用户的工作目录,看到两个文件.bash_profile和.bashrc,这两个文件里面有相应PATH配置的脚本。每次登录进xshell的时候,会把这这两个文件加载到内存,里面的有关环境变量的配置就会被执行一次,那么相应的环境变量的配置就会被刷新一次!

image-20230102152820130

image-20230102153050184

除此之外,还有别的环境变量,比如

HOME显示用户的工作目录
HOSTNAME显示主机名
LOGNAME显示用户名
HISTSIZE显示系统最多记住指令数
env查看环境变量

image-20230102153649776

可以通过history指令调用HISTSIZE环境变量查看最近输入的指令

image-20230102154047480

可以用wc统计最近输入的指令行数

image-20230102154019216

env查看环境变量

image-20230102155243919

那我现在不想通过指令获取环境变量,我想通过我写的代码获取呢??

getenv:获取环境变量—获取环境变量的第一种方式

这里有个函数getenv,获取环境变量,获取到了就返回环境变量的内容,失败了返回NULL

image-20230102160740456

在这里我写一个程序获取当前用户名

image-20230102164121596

作为普通用户获取后通过su -切换root用户重新登录后再运行一次获取用户名,发现不同的用户即在不同的使用场景下环境变量会有所改变。

image-20230102163828522

作为普通用户经常在使用到某些指令时失败并且会蹦出一句premisson denied,那么咱们也能写出这这样的程序,并且说明了这样的权限判定也是由坏境变量来决定的!

image-20230102164733606

然后我通过命令行(bash)创建一个本地变量mymal=520,本地变量在c语言中想当于main函数里的变量那样算是局部变量,然后通过代码查看myval是不是环境变量

image-20230102170506934

结果显示,bash创建的变量myval不算是环境变量

image-20230102170427462

那么现在可以通过export定义myval为环境变量

image-20230102171142567

进而引出一个结论:bash本身是一个进程,myprocess也会变成一个进程,且是bash的子进程,环境变量具有全局属性即会被子进程继承下去,原因是为了要满足不同的应用场景,比如getenv USER帮助我们进程身份认证。那么相对的刚刚提到的本地变量就只能在当前的进程使用!

那么我们要显示本地变量呢?

set查看本地定义的shell变量和环境变量

我创建一个本地变量mynumberty=532,通过set查看

image-20230102172203044

unset 取消(清除)环境变量或者本地变量

刚刚我们定义了一个myval环境变量,现在可以通过unset取消它,取消后过一会才会取消成功,然后通过set命令也查不到myval这个环境变量

image-20230102172510455

刚刚定义了一个本地变量mynumberty,那么也能通过unset取消它

image-20230102172759482

浅谈命令行参数

写一个有关命令行参数的程序

image-20230102181912507

然后运行它,并且后面携带选项,我们知道指令由**(./)程序 选项** 的模式组成;即命令行参数:程序加选项有几个(argc),那么就传几个值给argv数组,即定义多大的argv数组;(就和ls指令一样)

image-20230102182107172

比如我们输入ls -a -b -c指令,那么由shell和操作系统在命令行解析时,该输入的内容就是长字符串,那么被解析成由空格隔开的一个个字符串,数量传给argc,argc决定argv数组开辟多大,依次由顺序:程序到选项的方式传入argv数组,数组的最后是NULL

image-20230102183003312

那么命令行参数的意义呢?

命令行参数的意义:输入命令行由程序和选项组合,那么输入不同的程序和选项组合就运用不同的功能。

比如ls:显示当前目录下的文件(不包括隐藏文件) ls -l:显示当前目录下的文件包括文件详细信息(不包括隐藏文件)ls -a:显示当前目录下的全部文件(包括隐藏文件) ls -al 显示全部文件(包括隐藏文件)并且显示文件详细信息

image-20230102184145874

其实命令行参数还有一个,即char * env[]—环境变量表,main函数通过这个数组能找到对应想要的环境变量,即在不同的应用场景,使用不同的环境变量(进程找到环境变量)那么上面提到的argv数组就算命令行参数表!

获取环境变量的第二种方式:char* env【】

这里我写了个小程序,打印环境变量(环境变量表也是以NULL结尾)

image-20230102185227799

结果就真的打印了环境变量

image-20230102185620316

获取环境变量的第三种方式extern char **environ

这里还有一个函数可以获取环境变量,通过environ函数获取,environ本身是个指针,指向环境变量表

image-20230102190552622

这里我编写一些程序,运用这个函数不需要命令行参数

image-20230102191005185

然后运行它

image-20230102190956726

现在做个小总结,以上大致内容为 什么是环境变量?查看环境变量的几种方式,怎么定义环境变量,怎么取消环境变量,具体的几个环境变量介绍其功能,获取环境变量的几种方式,环境变量和本地变量的区别和怎么查看,命令行参数的讲解和环境变量的意义是什么?

好了对于环境变量的介绍和命令行参数的讲解就到这了。

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

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

相关文章

车载诊断协议UDS——读写服务Service 22/2E

在UDS协议中,对于服务常用有两种格式: 1、Service (服务) + Subfunction( 子服务) 子服务可理解为对服务的功能补充,比如会话模式Service 10服务,子服务可以分为不同的会话模式(默认会话模式、扩展会话模式、编程会话模式等等),用来区分服务的执行权限。 2、Servi…

[OC学习笔记]启动流程(objc部分)

先回顾下这张图,回顾下整体流程。现在分析下在此流程中objc4源码(818.2)的处理逻辑。 _objc_init解析 我们在上图可以看出,dyld在main函数之前(pre-main)会间接调用到objc的_objc_init,其中使…

洛谷—— AT_abc157_a [ABC157A] Duplex Printing

文章目录[ABC157A] Duplex Printing题面翻译题目描述输入格式输出格式说明提示题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2样例 #3样例输入 #3样例输出 #3提示制約Sample Explanation 1AC代码[ABC157A] Duplex Printing 题面翻译 题…

GC调优

GC调优一、新生代调优二、幸存区调优三、老年代调优四、GC调优案例案例一:Full GC和Minor GC频繁案例二:请求高峰期发生Full GC,单次暂停时间特别长(CMS)案例三:老年代充裕情况下,发生Full GC&a…

SQL中灵活的视图

文章目录视图的创建、嵌套及特性创建视图查询视图视图的嵌套常见的8个使用场景场景一:仅提供需要的数据场景二:对特定的用户仅开放特定的数据,达到保护敏感数据的目的,提升了数据安全性;仅筛选需要的数据场景四&#x…

迭代器模式 实现ES大量数据查询

目录 项目需求 要求 普通策略 升级策略:使用迭代器模式 迭代器模式组成 代码实现 查询实体 返回实体 实现类 代码测试 mock的ES返回结果json数据 第一次返回结果 第二次返回结果 第三次返回结果 postMan请求, 控制台打印结果 项目需求 数据从Mysq…

云计算服务安全指南

声明 本文是学习GB-T 31167-2014 信息安全技术 云计算服务安全指南. 下载地址而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 云计算服务安全退出服务 9.1退出要求 合同到期或其他原因都可能导致客户退出云计算服务,或将数据和业务系统迁…

植物大战僵尸:代码实现自动收集阳光

通过阳光增加的值为切入点,找到自动收集阳光的关键判断并实现自动收集阳光,首先我们猜测当阳光出现后,我们是否会去点击,这个过程必然是由一个判断和一个时钟周期事件来控制的,那么当我们点击下落的阳光以后&#xff0…

DC-UNet:重新思考UNet架构和双通道高效CNN医学图像

摘要 经典UNet的体系架构在某些方面存在着局限性。因此本文对其结构提出了改进。1)设计高效的CNN架构来取代编码器和解码器;2)在最先进的U-Net模型的基础上,应用残差模块来取代编码器和解码器之间的跳过连接来进行改进。 医学图像分割是通过一些自动和半自动的方法…

linux系统中块设备的基本实现方法

大家好,今天主要和大家聊一聊,如何使用linux系统中的块设备的实现方法。 目录 第一:块设备基本简介 第二:块设备驱动框架 第三:实现程序代码实现 第一:块设备基本简介 块设备驱动与字符设备驱动之间的主…

双指针:环形链表II

题目:142. 环形链表 II 我们知道,判断一个链表是否为环是这样的: public boolean hasCycle(ListNode head) {ListNode slow head,quickly head;while(quickly ! null && quickly.next ! null){slow slow.next;quickly quickly.n…

【javaSE】中异常如何处理

目录 文章目录 一、异常的初识 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 二、异常的处理和抛出 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.4异常的处理流程 三、自定义异常类 3.1举例:实现一个用户登录功能 一、异常的初识 1.1异常的概念 在…

Perl语法

Perl从许多语言中借用了语法和概念:awk,sed,C,Bourne Shell,Smalltalk,Lisp甚至是英语。每个简单的语句必须以分号(;)结尾,和Java类似,与Python不同。 一、扩…

【苹果推群发iMessage推】软件安装它起首将消息发送到Apple Push服务器,而后Apple Push服务器将消息发送到装配了应用程序的手机

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

《小猫猫大课堂》——数组,操作符,常见关键字

更新不易,麻烦多多点赞,欢迎你的提问,感谢你的转发, 最后的最后,关注我,关注我,关注我,你会看到更多有趣的博客哦!!! 喵喵喵,你对我…

Java--方法重写

1)概念 重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程 进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!重写的好处在于子类可以根据…

VUE动态组件,插槽和自定义指令

文章目录动态组件1.component组件的使用-keep-alive的使用keep-alive生命周期学习keep-alive组件的include和exclude属性include(指定keep-alive的哪些组件可以被缓存,不指定的话默认所有都会被缓存)exclude(排除项,与include刚好相反,二者不能同时使用)插槽v-slot指令v-slot的…

NodeJS - Express使用

文章目录1. 参数1.1 获取URL中的动态参数2. 静态资源2.1 挂载路径前缀3. nodemon4.1路由4.1 路由的匹配过程4.2 模块化路由4.3 为路由模块添加前缀5. 中间件5.1 全局生效的中间件5.2 全局生效中间件的简化形式5.3 中间件的作用5.4 局部生效的中间件5.5 定义多个局部中间件5.6 使…

计算机xxxxxxx

文章目录1.互联网的两大组成部分(边缘部分与核心部分)的特点是什么?它们的工作方式各有什么特点?2.简述分组交换的要点。3.试从多个方面比较电路交换、报文交换和分组交换的主要优缺点。4.网络协议的三个要素是什么?各…

十二、生产者和消费者问题、队列、线程池

内容 理解消费者、生产者的案例执行过程, 理解用队列方式做消费者、生产者的案例 会使用线程池运行任务, 理解ThreadPoolExecutor7个参数的含义(会根据需要 通过参数控制线程池的总数量) 匿名内部类里的异常处理 Thread 使用匿名内部类…