怎样做外部网站推广,营销型网站建设方案,那里做一元云购网站,安徽省建设厅网站域名目录背景1.概念2.常见环境变量2.1 PATH指令和自定义程序向环境变量PATH中添加路径删除PATH中的路径2.2 env#xff1a;显示所有环境变量2.3 环境变量相关的命令3.通过代码获取环境变量1.char* envp[]2.第三方变量enciron3.getenv函数获取指定环境变量4.利用获取的环境变量自制…
目录背景1.概念2.常见环境变量2.1 PATH指令和自定义程序向环境变量PATH中添加路径删除PATH中的路径2.2 env显示所有环境变量2.3 环境变量相关的命令3.通过代码获取环境变量1.char* envp[]2.第三方变量enciron3.getenv函数获取指定环境变量4.利用获取的环境变量自制pwd限制文件执行对象4.环境变量来自哪里.bash_profile.bashrc/etc/bashrc5.环境变量的全局性全局性6.环境变量总结7.main函数的前两个参数背景 大家在学习Java或Pathon亦或安装某个软件时大多经历过要修改环境变量的情况那环境变量是什么下面让我们一起来揭开环境变量 的神秘面纱。 1.概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。当我们在编写C/C代码时在链接时我们从来不知道所链接的动态库在哪但是照样可以链接成生成可执行程序原因就是有相关环境变量帮助编译器进行查找。环境变量通常具有某些特殊的用途还有在系统当中通常具有全局特性。
2.常见环境变量
PATH指定命令的搜索路径HOME指定用户的主工作目录即用户登录到Linux系统中时默认的目录SHELL当前Shell它的值通常是/bin/bashUSER存放当前用户的用户名
通常我们使用echo $NAME来查看对应的环境变量内容NAME环境变量名 PATH中各路径使用冒号 : 分隔
2.1 PATH
首先我们创建test.c 文件编写如下代码 其次创建makefile 文件编写如下代码 当我们完成相应的操作使用make指令创建对应的可执行文件myprocess 当我们想要执行这个可执行文件需要使用./myprocess那我们可不可以直接使用myprcess来执行呢答案当然是不行那要则没做才能办到呢这就和环境变量有关了。
指令和自定义程序
在Linux中我们使用指令(如ls)来操作系统而指令也是使用C写的放在系统的某个位置和我们写的程序是没有区别的这里我们使用file指令来查看ls和myprocess的区别 我们从上图可以看到指令和我们写的程序是没有区别的这些指令就是一个个已经写好的可执行文件。
我们通常想要执行一个可执行文件需要使用绝对路径或相对路径来定位需要执行文件的位置 相对路径./ 其中.表示当前路径/为路径分隔符绝对路径: home/../../可执行文件 所以想要执行一个可执行文件就需定位它的路径而我们使用的指令之所以不用带路径就能执行是因为它被纳入到基本指令的范畴路径已经实现被放到了环境变量PATH中如下图 每当我们使用指令完成某个操作系统就会从左向右找到环境变量中对应的路径执行该指令的可执行文件。
了解了这些我们就有两个方法使得我们的可执行文件不使用路径直接运行。
将可执行文件放入已经在环境变量中的某个路径下会有权限限制需在root用户下执行或sudo提权将可执行文件对应的路径添加到PATH 环境变量中
这里我们只讲第二种方法。
向环境变量PATH中添加路径
使用下面的指令来完成路径的添加
export PATH$PATH:对应的路径其中是将$PATH:对应的路径赋值给PAT新的值会覆盖原有的值$PATH代表PATH中的原路径使用 : 分割之后是添加的新路径
如下图向PATH环境变量 中添加myprocess 可执行文件的对应路径之后查看PATH是否修改 此时我们就在该目录下创建的可执行文件即可只使用文件名运行了 删除PATH中的路径
下面的指令表示为PATH重新赋值将之前的值覆盖
export PATH对应的路径比方说PATH中的路径如下
路径1:路径2:路径3:路径4我们想要删除路径4 只需复制路径1:路径2:路径3之后复制给PATH即可
export PATH路径1:路径2:路径3我们使用该方法删除上面添加的路径如下图 注意 若使用export PATH..时使用错误覆盖了原来的所有路径重启终端关闭shell重新启动即可。 也就是说我们进行PATH的配置只在本次登录有效当重启后我们添加的路径就会消失变为原本系统默认的路径。如果想要可执行文件永久使用文件名运行需要将其移至永久有效的路径下相同的删除也只能删除路径下对应的文件。拷贝和删除文件时有权限限制 2.2 env显示所有环境变量
我们可以使用env指令显示所有的环境变量如下 其中 HOSTNAME表示这台机器的主机名 HISTSIZE表示保留之前指令的最大数量 我们想要看到命令行中输入的历史命令可以使用history指令但操作系统不会将我们所写的指令都保存下来只会保留最新的HISTSIZE个历史指令 SSH_CLIENT表示当前是那台主机在登录我们的Luinux机器 USER当前登录用户 我们创建一个文件或是目录创建后它的所属组和拥有者都是根据USER来给定的 使用su指令切换用户USER不会发生改变使用su -指令切换用户USER会发生改变 LS_COLOR配色方案 当我们使用某些指令时会发现一些数据的颜色区别于其它数据这就是由LS_COLOR指定的 PWD确认当前用户所在的路径 我们使用pwd指令获取当前所在位置时使用的就是这个环境变量 HOME表示当前用户所在的家目录 不同的用户HOME值不同 LOGNAME表示登录的用户 使用su指令切换用户LOGNAME不会发生改变使用su -指令切换用户LOGNAME会发生改变
环境变量是根据特定的人在特定的场景中使用的
2.3 环境变量相关的命令
echo: 显示某个环境变量值(在环境变量名前加$符)export: 设置一个新的环境变量env: 显示所有环境变量unset: 清除环境变量set: 显示本地定义的shell变量和环境变量
3.通过代码获取环境变量
C/C代码main函数是程序的入口main函数可以接收参数最多可以接收三个或是两个参数写法如下
int main(int argc,char* argv[],char* envp[])
{}编译器在编译时会自动传递这三个参数只是我们不用而已其中也可以只接收前两个参数最后一个不写我们这里先来讲最后一个参数char* enpv[]知道这个剩下两个就好理解了。我们的进程内部本身就有环境变量这需要我们去获取下面就是获取方式
1.char* envp[] envp为指针数组main函数的第三个参数存放指针指针对应的数据为环境变量执行一个额一’\0’结尾的环境字符串第一个无效内容指向NULL 这里我们要区分两个概念
指针表示地址凡是具有指向能力的数据都叫指针指针变量表示变量在内存中开辟空间具有存储和被修改的能力
envp指针数组存放的是指针指针的类型为char指向字符串或字符这里的envp是指向字符串也就是环境变量。
我们将test.c 文件修改如下 其中当envp[i]为NULL时表示有效数据已经循环完毕
将makefile文件修改如下 使用make指令生成可执行文件之后运行得出下面的结果 输出的正是环境变量我们可以通过该方法在我们自己写的程序内获取环境变量。
2.第三方变量enciron 除了main函数的第三个参数我们还可以使用libc中定义的全局变量environ 指向环境变量表来获取环境变量。 注意
environ没有包含在如何头文件内在使用时要用extern声明表示为外部变量。environ为二级指针相当于指针数组指向环境变量表
将test.c 修改如下 使用make指令生成对应的可执行文件之后执行该文件获得如下结果 我们依然可以看到使用该方法就可以获得环境变量。
问题
我们已经知道可以通过main函数的第三个参数或二级指针environ变量获取环境变量然后呢难道我们要用的时候只能通过遍历环境变量表来获取想要的环境变量吗这是不是太麻烦了 这样做在我们想要获取某一环境变量时却是i不方便所以我们在实际操作中最常用的是下面要讲的函数获取环境变量想要什么环境变量直接告诉函数通过它来获取。 3.getenv函数获取指定环境变量 通过向getenv函数传递想要获得的环境变量的环境变量名来获取该函数头文件为**stdlib.h** 格式
char* 变量名 getenv(环境变量名);我们通过下面的代码来演示获取USER的环境变量其它的环境变量也是一样的
首先将test.c 文件修改如下 使用make指令生成可执行文件执行该文件获取如下结果 想要获取其它的环境变量也是使用相同的方法
4.利用获取的环境变量 现在我们既然可以获取到环境变量了那我们该用它来做什么呢下面通过两个例子来向大家介绍一二 自制pwd
我们可以自己写一个程序来获取当前所处的位置如下
首先再次将test.c 文件修改如下 使用make指令生成可执行文件后执行它获取如下结果 我们还可以将该可执行文件的路径放在PATH环境变量下在为其改名为mypwd 这样我们在如何地方都可以执行它如下 限制文件执行对象 若一个可执行文件我们只想要让自己或其它指定用户使用我们可以依靠环境变量做出限制 首先再次将test.c 文件修改如下 注意该程序用到strcmp函数该函数需要引用string.h 库
其次使用make指令生成可执行文件在两个用户下执行该文件查看结果
用户YX root用户
注意这里要使用su -来切换到root用户的家目录在到可执行文件的目录下运行该文件才可以看到效果。否则对应的USER环境变量不会改变 4.环境变量来自哪里 环境变量是我们登录LInux系统后在对应用户的家目录 下的.bash_profile和.bashrc两个配置文件中获取的 .bash_profile
打开.bash_profile文件查看其内容 在我们登录成功后系统会调用该配置文件执行其内容调用.bashrc配置文件加载配置文件PATH环境变量得以添加。
.bashrc
在打开.bashrc文件查看其内容 /etc/bashrc 存放全局的环境变量
总结
登录系统后系统会调用对应用户家目录下的.bash_profile配置文件.bash_profile配置文件中又调用同目录下.bashrc配置文件而.bashrc配置文件又调用/etc/bashrc配置文件生成环境变量。
5.环境变量的全局性 环境变量本质就是一个内存级的一张表这张表由用户在登录系统时进行给特定用户形成属于自己的环境变量表。而环境变量通常具有全局属性可以被子进程继承下去。 我们先来看一下下面的两种情况
情况1
我们在命令行中编写一个变量并为它赋值之后使用echo指令取出 情况2
在命令行编写变量并为它赋值时使用export指令修饰使其变为环境变量之后使用env指令查看 大家或许都知道这两种现象的存在但对于它为什么存在却知之甚少原因如下
情况1 系统启动后它的shell也是一个进程在内存内有自己的一块空间用来存储环境变量表或是读取到的命令等等当我们在命令行中写下字符串mynum100 后会在它的上下文中使用malloc 开辟一块空间用来存放对应的字符串如下图 此时被shell存下的变量叫做本地变量只在shell的内部有效
情况2 当我们使用export指令后系统会在环境变量表的第一个无效的内容处存放export后的字符串或者可以理解为在环境变量表中使用malloc 开辟一块空间存放字符串 全局性 我们在Linux中使用指令或是执行可执行文件都是创建子进程的过程而这些子进程的父进程都是shell在子进程创建时shell会将自己内部维护的环境变量表传给子进程使其也可以使用环境变量这就是环境变量通常具有全局属性可以被子进程继承下去。 证明如下
将test.c 文件修改如下 使用make指令生成对应的可执行文件并执行结果如下 通过上图我们看到在命令行中我们设置的环境变量mynum50 在子进程中依然可以得到父进程的确将环境变量交给了子进程。
证明环境变量是可以被子进程继承下去的
6.环境变量总结
环境变量本质就是一个内存级的一张表这张表由用户在登录系统时进行给特定用户形成属于自己的环境变量表。环境变量是由shell维护的创建子进程后shell会使用一些方法将其传给子进程证明环境变量具有全局属性。环境变量中的每一个都有自己的用途有的是进行路径查找的有的是进行身份认证的有的是进行动态库查找的有的是用来进行确认当前路径等等。每个环境变量都有自己独特的应用场景。每一个环境变量都有自己的名字和内容。环境变量都是从相关配置文件中读取出来的所以每次登录环境变量是相同的在家目录下的.bash_profile和.bashrc中
7.main函数的前两个参数 main函数是可以接收三个参数的最后一个是接收env环境变量表的而前两个是可以单独写的用来接收选项 。 int main(int argc,char* argc[],char* envp[])我们在执行指令时经常后待一些参数比如使用ls指令时会使用-l、-a等参数 而ls也是一个可执行文件该文件所在位置存放在环境变量PATH中我们可以不去管它的位置直接使用文件名即可运行既然是可执行文件那它对应的程序中一定有main函数它main函数中的前两个参数就是用来接收命令行中输入的选项的。
int main(int argc,char* argv[])argv存放命令行中传入的选项的地址包含可执行程序这个字符串第一个无效字符存放NULLargc表示传入的选项个数
接下来我们来测试一下
先将test.c 文件修改如下 接着使用make指令生成可执行文件执行如下指令 我们看到父进程bash将命令行中的字符串使用空格分割传给子进程main函数的argv 参数。
这就是我们在使用指令时对应的程序识别选项的方法原因。
我们接下来写一个小程序来模拟选项的实现
将test.c 文件修改如下功能为只向可执行程序传输一个选项不包含可执行文件名执行对应的操作若一个没有则返回一段提示告诉用户需传输选项 使用make指令执行可执行文件对其进行测试如下