资讯专栏INFORMATION COLUMN

10 Linux环境变量

zhkai / 969人阅读

摘要:变量是一个类型,存储着系统的环境变量。五通过系统调用函数获取环境变量使用函数获取环境变量的值。六环境变量通常是具有全局属性的环境变量具有全局属性,体现在父进程的环境变量信息是可以被子进程继承下去的。

在Linux下,命令实际上也是一个放在磁盘中的可执行文件,要执行一条命令一般分为两步:1.找到这条命令 2.运行它的可执行文件



一、什么是环境变量

  • 环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数
  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

环境变量用一句话概括就是指明操作系统重要的目录在哪里

比如在Windows下输入%systemroot%,就会打开Windows下的系统总目录:

systemroot(system系统root根目录)就是Windows系统下的一个环境变量,作用是指明系统总目录的位置。

所以如果一个程序需要从这个系统总目录中读取文件信息,那直接通过环境变量就能找到系统总目录,而不用从所有磁盘上一个一个找,从而提高了效率。

还有一个环境变量Path

在系统对话框中输入cmd后,系统会在Path环境变量指明的目录下寻找这个cmd可执行程序,如果找到了就运行它,找不到就提示没找到。

所以,如果想让我们自己写的程序也可以在系统对话框中直接运行,就有以下两种办法:1. 将程序拷贝到System32这个目录下(不推荐这样做,因为这样会污染这个目录)2. 将程序的路径放到Path环境变量中。

二、常见的环境变量

使用env指令可以查看当前所有的环境变量:

常用的三个:

  • PATH : 指定命令的搜索路径
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
  • SHELL : 当前Shell,它的值通常是/bin/bash。

PATH

使用echo $环境变量名称的命令可以查看指定的环境变量内容,以echo $PATH为例:

可以看到环境变量PATH当中有多条路径,这些路径由冒号隔开,当使用Linux的命令比如ls时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找。如果找到了就执行这条命令,找不到就报错command not found

这也就解释了为什么运行可执行程序一般这样写./程序名,这样写的目的是为了指明路径从而找到这个程序。而ls这种命令就不需要加./,因为有默认的查找路径。

和在Windows下一样,如果想让我们自己写的可执行程序不加路径就能运行,也有两种方法:1.将我们的可执行程序拷贝到PATH的某一路径下(不推荐,会污染Linux自带的命令池) 2.将可执行程序所在的目录导入到环境变量PATH当中。

第一种方法比较简单,并且不推荐。这里强调一下第二种方法:
将可执行程序所在的目录导入到环境变量PATH当中可以采用下面的命令:
export PATH=$PATH:程序路径名
注意这里如果缺少了 $PATH会清空原来 $PATH 的内容(类似于重定向符号>)。

不过这种方法只是在当前终端有效,离开当前终端就失效了。

如果想永久生效的话可以直接修改配置文件:

  1. vim ~/.bashrc
  2. 在文件末尾加上export PATH=$PATH:程序路径名
  3. 使用source .bashrc命令使刚才的更改发生作用
  4. 重启或者打开其他中断即可。

HOME

环境变量HOME当中即保存的该用户的主工作目录:

一个用户登录的时候默认所处的路径就由HOME这个环境变量决定。

SHELL

Linux当中有许多种命令行解释器(例如bash、sh),我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释器的种类:

而该命令行解释器实际上是系统当中的一条命令,当这个命令运行起来变成进程后就可以为我们进行命令行解释。


三、环境变量的组织方式


每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’/0’结尾的环境字符串。


四、使用代码获取环境变量

main函数其实有三个参数,只是我们平时基本不用它们,所以一般情况下都没有写出来。
int main(int argc,char* argv[],char * envp[])
第一个参数是命令行参数的个数,第二个参数是命令行参数,第三个参数是环境变量

第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置其余字符指针存储的是所给的若干选项,最后一个字符指针为空。通过不同的选项就可以指定程序不同的输出形式

以下面的程序进行验证:

#include int main (int argc,char *argv[]){ int i; for(i = 0; i < argc; i++) {      printf ( "argv[%d] : %s/n",i,argv[i]);        } return 0;}

第三个参数也是一个字符指针数组,接收的实际上就是环境变量表,可以通过main函数的第三个参数来获取系统的环境变量:

除此之外,也可以使用外部变量来获取环境变量。
environ变量是一个char**类型,存储着系统的环境变量。
因为environ是一个全局的外部变量,所以切记使用前要用extern关键字进行声明,然后再使用。

#include int main(int argc, char *argv[]){ extern char **environ; int i = 0; for(; environ[i]; i++){ printf("%s/n", environ[i]); } return 0;}

五、通过系统调用函数获取环境变量


使用getenv函数获取环境变量PATH的值。


六、环境变量通常是具有全局属性的

环境变量具有全局属性,体现在:父进程的环境变量信息是可以被子进程继承下去的

比如我们打印一个不存在的环境变量:

可以看到什么信息也没有。
由于这个程序是bash的子进程,因此给bash设置MYENV环境变量后,就可以被子进程继承下来:


七、补充几个和环境变量相关的命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

总结:

什么是环境变量:系统中的某些具有一定全局性质的变量,通常是为了满足某些系统需求。

为什么要有环境变量:指明操作系统重要的目录在哪里。系统的全局变量都是为了方便用户、开发者和系统进行某种最简单化的查找、定位、确认等问题。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/122127.html

相关文章

  • Linux运维:Shell脚本(1)

    摘要:且脚本文件的后缀名通常以结尾。参数个数不状态码为的注意点判断命令,脚本或函数等程序是否执行成功。常用于源码编译安装软件,在每个步骤获取的状态码来判断命令执行是否成功。若是在脚本中调用执行数字,则会返回这个数字给变量。 将自己之前的shell脚本笔记搬到segmentfault,顺带复习一下shell基础。笔记大多是读时所记录,推荐想学shell的可以去看看。2019-1-26 系列笔记...

    187J3X1 评论0 收藏0
  • Linux运维:Shell脚本(1)

    摘要:且脚本文件的后缀名通常以结尾。参数个数不状态码为的注意点判断命令,脚本或函数等程序是否执行成功。常用于源码编译安装软件,在每个步骤获取的状态码来判断命令执行是否成功。若是在脚本中调用执行数字,则会返回这个数字给变量。 将自己之前的shell脚本笔记搬到segmentfault,顺带复习一下shell基础。笔记大多是读时所记录,推荐想学shell的可以去看看。2019-1-26 系列笔记...

    张金宝 评论0 收藏0
  • 使用 Linux 子系统部署 Node、Gradle 项目的构建工具

    摘要:最近的一个项目,由三个工程以及一个工程组成。为了使用下的各种工具提升效率,本文探讨子系统的使用及在该系统下,等工具的配置。参考链接内置子系统初体验设置环境变量并立即生效设置环境变量的方法和区别官网工具的使用简明安装教程 最近的一个项目,由三个 Gradle「Java」工程以及一个 Node「Vue.js」工程组成。为了使用 Linux 下的各种工具提升效率,本文探讨 Linux 子系统...

    frank_fun 评论0 收藏0
  • 使用 Linux 子系统部署 Node、Gradle 项目的构建工具

    摘要:最近的一个项目,由三个工程以及一个工程组成。为了使用下的各种工具提升效率,本文探讨子系统的使用及在该系统下,等工具的配置。参考链接内置子系统初体验设置环境变量并立即生效设置环境变量的方法和区别官网工具的使用简明安装教程 最近的一个项目,由三个 Gradle「Java」工程以及一个 Node「Vue.js」工程组成。为了使用 Linux 下的各种工具提升效率,本文探讨 Linux 子系统...

    MageekChiu 评论0 收藏0
  • 使用 Linux 子系统部署 Node、Gradle 项目的构建工具

    摘要:最近的一个项目,由三个工程以及一个工程组成。为了使用下的各种工具提升效率,本文探讨子系统的使用及在该系统下,等工具的配置。参考链接内置子系统初体验设置环境变量并立即生效设置环境变量的方法和区别官网工具的使用简明安装教程 最近的一个项目,由三个 Gradle「Java」工程以及一个 Node「Vue.js」工程组成。为了使用 Linux 下的各种工具提升效率,本文探讨 Linux 子系统...

    zhichangterry 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<