环境变量?拿来把你!
创始人
2024-05-05 07:44:23
0

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

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

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

相关内容

热门资讯

【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AsusVivobook无法开... 首先,我们可以尝试重置BIOS(Basic Input/Output System)来解决这个问题。...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...