【Linux】Linux下的环境变量(什么是环境变量,环境变量有什么作用?) |
您所在的位置:网站首页 › linux彻底删除不可恢复命令是什么 › 【Linux】Linux下的环境变量(什么是环境变量,环境变量有什么作用?) |
目录 一、前言 二、什么是环境变量? 三、如何添加环境变量? 四、如何获取环境变量? 💧环境变量相关的命令💧 💧测试HOME与USER💧 🔥环境变量的获取方式🔥 ① envp表的介绍 ② 通过命令行获取环境变量 ③ 通过函数获取环境变量 五、详谈环境变量 🔥深入理解环境变量表🔥 🔥命令行参数的意义 🔥 五、总结与提炼 六、共勉 一、前言环境变量是一种非常重要的概念,它对于系统的行为和应用程序的运行起着关键的作用。 那么环境变量究竟在扮演着什么样的角色呢?为什么我们在编写C/C++代码的时候,不需要显式的告诉编译器我们所需要的动静态库在那,但链接照样可以成功的生成可执行程序,其实这里就有环境变量的辅助,所以接下来,就让我们一起来学习 ----- 环境变量 二、什么是环境变量?首先我们在聊【环境变量】之前知道它是什么👇 环境变量(environment variables):一般是指在操作系统在开机的时候帮我们维护系统运行时的一些动态参数 读者可以回忆一下我们在学习 Java / Python 的时候,你们的老师是否有让你们配置过一个东西叫做【环境变量】呢?本文我们要讲的其实就是这个 打开【高级系统设置】中的【环境变量】,我们就可以看到熟悉的一幕了,如果有配置过Java中JDK的话一定会对这个有所印象接下去我们要谈的是有关 --- 运行一个程序的方式 在 Windows 中,我们去运行一个程序是通过双击的形式在 Linux 中,我们去运行一个程序是通过./的形式 那你是否想过在Linux中为什么我们不能直接通过敲入这个可执行程序的名字来运行这个程序呢?看到下面这二者的区别
💬 那有同学就诧异了,为什么一定要带上路径呢?为什么我直接运行就不行呢? 因为在我们的 Linux系统中是存在一个东西叫做【环境变量】的,这个环境变量可以帮助我们在系统特定的路径下找到那些指定的程序,例如我们在使用指令 [ls] 的时候,也是有这个【环境变量】的缘故才得以使我们能够正常地去运行这个指令,因为对于[ls]来说,你也可以将其看做是一个程序,它的存放路径是 /usr/bin/
那么一直在说这个环境变量,那它到底长什么样呢?我们来看看 常见的环境变量: PATH: 这个【环境变量】定义了系统在执行命令时查找可执行文件的路径。当你输入一个命令时,系统会在 PATH 中指定的路径下查找是否存在该命令的可执行文件,如果存在,则执行该命令。如果 PATH 中没有包含命令的可执行文件路径,则系统会提示“command not found”。(完美符合上面的情景)HOME: 这个【环境变量】指定了当前用户的主工作目录,也就是用户登录系统后所处的默认目录。当用户执行 cd 命令时,如果没有指定目标目录,则系统会切换到 HOME 目录。SHELL: 这个【环境变量】定义了当前用户所使用的 Shell。Shell 是用户与操作系统之间进行交互的界面,它解释并执行用户输入的命令。通常情况下,SHELL 的值为 /bin/bash,表示用户正在使用 Bash Shell。其他常见的 Shell 包括 /bin/sh、/bin/zsh 等。查看环境变量: 如果要去查看这个【环境变量】的话,就需要使用到我们之前所学习过的一个指令叫做echo,其主要是用来【用于打印字符或者回显】,在其后面更上一个$PATH,我们就可以去查询到当前系统中所有的环境变量这个$呢可以看作是我们在C语言中学习过的指针,那时我们通过*去对指针所指向的内容进行解引用的操作,在这里也可以这样去理解 echo $PATH 那我们运行来看一下,因为系统中的环境变量有很多,所以我们这里是以[:]来进行分割,刚才我们所执行的【ls】指令就是在这个/usr/bin这个路径下的
💬 所以我们就可以回答上面的那个问题了:为什么 mytest 不可以,ls 却可以直接运行呢? 我们默认的程序,在系统中会存在一个环境变量,这个环境变量能够帮我们在系统中特定的路径下搜索这个特定的命令。因为当前的这个 mytest 程序并不在系统的环境变量目录下,所以我们想要运行这个程序的,就需要手动地将这个程序添加到环境变量的目录下 三、如何添加环境变量?那要怎么去将一个系统路径添加到【环境变量】中呢👈 这里要使用到一个关键字叫做 export,然后将我们所要添加的路径放到其中即可 export PATH=/路径 在将这个路径添加到环境变量之后,我们再去直接执行这个程序,就可以发现它可以像正常的程序一样运行了。但是呢,当我在运行其它指令的时候,却发现它们都无法执行了,这时就有同学疑惑了,这是为什么?
所以我们在往环境变量里面添加路径的时候,不应该形成覆盖,这里我再介绍一种方法 export PATH=$PATH:/路径 那我们按照这个方法来运行的话再去查看环境变量就可以发现,这个路径被添加进去了,而且并没有覆盖掉其他的内容
但是呢,当我们再去将服务器重启之后,再度运行这个可执行程序的时候,便可以发现我们之前添加的路径不见了。那这就又造成了很多同学的困扰,这该怎么办呢?
首先我们来讲一讲和环境变量相关的命令有哪些 echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量unset: 清除环境变量set: 显示本地定义的shell变量和环境变量 第一个echo、export 我们在上面讲到 添加环境变量 的时候就谈到了,接下去我们来讲讲这个 env。可以看到在敲出这个命令之后我们发现系统中所有的环境变量都显示出来了在这里我们可以来测试一下在不同用户之下所看到的环境变量有何不同,可以看到在普通用户下去查看 HOME 的时候出现的就是当前用户的家目录,如果是【root】的话出现的便是超级用户的目录;对于 USER 来说也是同理 💬 所以环境变量呢是针对特定的人在特定的场景下被使用的,其会随着登录用户的不同而变化 🔥环境变量的获取方式🔥相信有大部分的读者都学习过C语言,那么对于main函数和指针一定有所了解 ① envp表的介绍💬 首先的话我想问一个问题:main函数的参数可以有几个呢? 那可能很多同学都不知道怎么回答,函数大家都有接触过,可以带的参数并没有多大的限制,但是对于 main函数 的话可能大家都是不带参数或者直接写个 void代表空参 那这里就要给读者普及一下了,对于 main函数 而言我们是可以携带【0】、【2】或【3】个参数的。即下面的三种形式 int main(void) int main(int argc, char *argv[]) int main(int argc, char *argv[], char *envp[]) 头两种形式大家或多或少见到过,不过本文我们重点要讲解的则是第三种形式,也就是这个带三个参数的,我们重点关注的是 envp[] --- 这个指针数组,如果对这一块知识点还不是很熟悉的同学可以去看看 指针数组详解 对于这个envp,它里面所存放的都是一个个指针,这些指针都指向了一个个的字符串,即它的众多有效内容指向一个字符串,但是第一个无效内容必须去指向NULL,所以我们也可以称之为【表结构】好,接下去我们再来做一个提升,既然有【环境变量】这个东西,那我们就要利用好它,来做一个只允许指定用户来运行当前的程序 废话不多说,我们直接通过代码来看看,在这里我们涉及到名称的比较,所以我们需要使用到C语言中的strcmp,这里记得要包含头文件哦 #include #include #include #define NAME "XAS" int main(void) { char* own = getenv("USER"); if(own == NULL) perror("getenv fail"); else if(strcmp(own, NAME) == 0) printf("程序正常执行\n"); else printf("抱歉,当前用户 %s 没有权限执行此程序\n", own); return 0; } 那因为这里我们需要指定用户来运行,所以在这里我将切换为 root,但是呢有一点很奇怪的是即使我们已经切换到了 root 的这个账户之下,但是为什么我在限定了只有 XAS 这个用户才可以访问之外,root也可以来进行访问呢?右侧的话我其实已经给到提示了,问题出在这个su上,读者有必要知道一下它们的区别su命令: 仅切换用户身份,不改变环境变量。环境变量继承原用户的环境,如HOME、SHELL等。效果相当于以其他用户身份登录系统。su - 命令: 不仅切换用户身份,还改变环境变量。环境变量从新登录该用户时的环境变量重新获取。效果相当于重新登录系统。因此经过上面的学习我们知道了要真正地去改变当前系统的环境变量时,尤其是我们在切换到 root 用户的时候,我们要使用到su -才可以起到真正的切换 我们来看看最后的执行结果可以发现,使用su -切换到 root 用户下的时候在执行这个可执行程序时,出现了不一样的结果,就是因为当前用户已经完完全全转为了 root,所以我们在进行比较的时候就进入了第三个分支最后再来补充一点,也就是我们上面谈到过的有关环境变量的命令unset 首先可以看到,当我们设置了一个环境变量 myval后,通过[echo]的方式去进行打印,此时我们就看到了这个变量所对应的属性,接下去呢我通过unset清除掉了这个环境变量,此时再去通过[echo]的方式打印时,就看不到内容了 再来看一点,我又使用export将其放入环境变量表中,此时我们通过[env]配合[grep]指令去显示所有环境变量的时候,就看到这个变量通过键值对的形式进行展现在上面我们有谈到过,对于每个用户而言都有属于自己的环境的环境变量表 在环境变量表中的每一个,都有各自的用途 有进行路径查找的有进行身份验证的有进行动态库查找的有用来确认当前路径的环境变量在启动的时候就已经在内存中,所以它是一张内存级的表 那么环境变量所对应的数据是从哪里来的呢? 答:是从系统的相关配置文件中读取进来的,首先我们可以来看看当前家目录下的.bashrc这个文件,其主要是用来设置Bash shell的一些环境变量和别名好,最后的话我们再来拓展一个东西叫做【命令行参数】 这个的话我们上面在讲 环境变量的获取方式 时有所提及,即这个argc和argv,首先我来说一下它们分别是什么意思 argc 是一个整数,表示命令行参数的数量(包括程序名本身)(就是说,argc也是argv这个数组里元素个数)。char *argv[]是一个字符数组;argv 是一个指向字符指针数组的指针,每个指针指向一个以 null 结尾的字符串,表示一个命令行参数。 int main(int argc, char* argv[]) 在知道它们分别是什么意思后呢,我们就可以通过代码的形式展现出它们的作用想必在通过以上的展示后你就可以初步地感受到命令行参数的魅力所在了 但是呢光就这么去看的话还不是很人性化,我们可以考虑再做一个 菜单选项,让用户去进行对应的选择,或者呢让用户一定要输入至少2个命令选项,否则的话就直接终止程序以下是本次测试的示例代码: void Usage(const char* name) { printf("\nUsage: %s -[a|b|c]\n", name); exit(0); } int main(int argc, char* argv[]) { if(argc != 2) Usage(argv[0]); if(strcmp(argv[1], "-a") == 0) printf("打印当前目录下的文件名\n"); else if(strcmp(argv[1], "-b") == 0) printf("打印当前目录下文件的详细信息\n"); else if(strcmp(argv[1], "-c") == 0) printf("打印当前目录下的文件名(包含隐藏文件)\n"); else printf("其他功能, 待开发\n"); } 运行之后可以看到,当我们直接去运行这个程序的时候,因为没有添加参数,所以程序直接终止了,而且打印出了可供选择的菜单项,接下去在我添加上这个命令选项参数的时候,在选择了对应的参数之后就打印出了对应的内容那有同学问,说了这么久,还不是只能在Linux下运行吗,Windows下可不行哦! 这一块的话读者可以去Windows下的【命令提示符】,简称:cmd 看看,键入下面这句话看看 shutdown /? 于是呢我们就可以看到,也是会出现许多的命令行选项供我们选择,每一个选项都对应着不同的含义(具体地读者可以自己去试试看)💬 以上呢就是我们所要讲的【命令行参数】 五、总结与提炼最后来总结一下本文所学习的内容📖 首先在开篇,我们提到了环境变量的基本概念,知道了如果我们要去运行一个程序的话就需要将其路径添加到环境变量中,当系统的环境变量中有了这个路径之后当我们在执行此程序时它就可以去识别到路径下有这个内容那如何添加呢?通过export PATH=$PATH:/路径的方式即可.再者我们就要考虑到如何去通过代码如何 获取到这些环境变量,首先对于环境变量相关的命令大家要知晓,其中echo、export、env这些是会频繁使用。并且呢很重要的一点是对于不同用户来说环境变量是会不同的,会随着用户的登入而自动为其配置环境变量在了解了基本的概念之后我们就可以通过代码去获取到相关的环境变量,分别是有:命令行第三个参数、通过函数获取,其中大家重点要掌握的是第三个方式,学会使用getenv()这个方法去获取到相关的环境变量但是呢光就这么去获取的话我们还无法深入地理解到【环境变量】的含义,于是我们开始去了解一些配置文件,看到了很多在我们启动系统时就会进行配置的内容,于是更加进一步地了解到了确实有【环境变量】这个东西的存在。不仅如此,我们还通过shell所执行的命令去观察,因为这些命令都是shell的子进程,所以当它执行命令的时候 ,就相当于是父进程在执行子进程。那通过执行的结果我们可以看出shell将自己的环境变量表交给了执行的子进程,继而它可以去获取到表中对应的内容 六、共勉以下就是我对【Linux系统编程】环境变量 的理解,如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新【Linux系统编程】,请持续关注我哦!!! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |