当前位置: 首页 > news >正文

环境变量?拿来把你!

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

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

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

相关文章:

  • 【柔性数组与局部性原理】
  • SCI论文解读复现【NO.3】MSFT-YOLO:基于变压器的改进YOLOv5钢表面缺陷检测(代码已复现)
  • 2022年度总结|我的CSDN成长历程
  • CSS基础总结(五)定位
  • 一文学会基础的TypeScript
  • js函数之call和apply
  • stm32平衡小车(1)---蓝牙模块及其bug处理
  • [JavaEE]线程的状态与安全
  • 【Qt】事件处理——按键事件处理
  • opencv-python常用函数解析及参数介绍(八)——轮廓与轮廓特征
  • flutter项目编译问题汇总
  • C++关联容器(复习题篇)
  • 02SpringCloudAlibaba服务注册中心—Eureka
  • opencv-python常用函数解析及参数介绍(七)——边缘检测
  • 14---实现文件上传和下载(头像上传功能)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 【面试系列】之二:关于js原型
  • Apache的基本使用
  • CentOS6 编译安装 redis-3.2.3
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Java精华积累:初学者都应该搞懂的问题
  • k个最大的数及变种小结
  • Mocha测试初探
  • Octave 入门
  • SpringBoot几种定时任务的实现方式
  • windows-nginx-https-本地配置
  • yii2权限控制rbac之rule详细讲解
  • 百度地图API标注+时间轴组件
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 基于webpack 的 vue 多页架构
  • 为什么要用IPython/Jupyter?
  • media数据库操作,可以进行增删改查,实现回收站,隐私照片功能 SharedPreferences存储地址:
  • 【云吞铺子】性能抖动剖析(二)
  • NLPIR智能语义技术让大数据挖掘更简单
  • 仓管云——企业云erp功能有哪些?
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​虚拟化系列介绍(十)
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #宝哥教你#查看jquery绑定的事件函数
  • (1)(1.9) MSP (version 4.2)
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (六) ES6 新特性 —— 迭代器(iterator)
  • (一)u-boot-nand.bin的下载
  • (转) ns2/nam与nam实现相关的文件
  • (转)Scala的“=”符号简介
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)