• 【Linux】环境变量



    一.什么是环境变量

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

    二.常见的环境变量

    我们先了解一下这些环境变量大概是什么,还有与环境变量相关的命令有什么,然后再详解每个环境变量。(ps:windows操作系统下–高级系统设置中也能查找到环境变量)

    1.常见的环境变量和与之相关的命令

    • 常见环境变量
    • PATH:指定命令的搜索路径
    • HOME:指定用户的主工作目录(即用户登录到Linux系统中时,默认的目录)
    • SHELL:当前Shell,它的值通常是/bin/base
    • 环境变量相关的命令
    • echo:查看某个环境变量的值
    • export:设置一个新的环境变量
    • env:显示所有环境变量
    • unset:清除环境变量
    • set:显示本地定义的shell变量和环境变量

    2.PATH指定命令搜索路径

    在Linux下,如果我们要执行一个可执行程序,输入的命令是:./a.out,那么实际上a.out也是一个命令,但是我们在命令行直接输入a.out,程序不能被执行。那么问题来了,为什么有些指令可以不用带路径就直接执行,而我们的二进制程序需要带路径才能执行呢?

    因为环境变量PATH中没有我们这个命令的搜索路径,操作系统不能直接搜索到,解决方法就是将我们程序所在的路径加入到环境变量PATH当中。下面将对其进行演示:将会用到echo,export命令。

    在这里插入图片描述
    在这里插入图片描述

    3.env显示所有环境变量

    下面是一些常见环境变量。

    ◆ HISTSIZE是指保存历史命令记录的条数。

    ◆ LOGNAME是指当前用户的登录名。

    ◆ HOSTNAME是指主机的名称,许多应用程序如果要用到主机名的话,通常是从这个环境变量中来取得的。

    ◆ SHELL是指当前用户用的是哪种Shell。

    ◆ LANG/LANGUGE是和语言相关的环境变量,使用多种语言的用户可以修改此环境变量。

    ◆ MAIL是指当前用户的邮件存放目录。

    ◆ PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是附属提示符,默认是">"。可以通过修改此环境变量来修改当前的命令符,比 如下列命令会将提示符修改成字符串"Hello,My NewPrompt "。

    PS1=" Hello,My NewPrompt "

    除了这些常见的环境变量,许多应用程序在安装时也会增加 一些环境变量,比如使用Java就要设置JAVA_HOME和CLASSPATH等,而安装五笔输入法会增加环境变量"XMODIFIERS=@im=fcitx"等。
    在这里插入图片描述

    4.echo查看环境变量

    注意环境变量前一定要加$符号
    在这里插入图片描述
    在这里插入图片描述

    三.本地变量与环境变量的联系

    那么了解了常见的环境变量之后,我们来看看本地变量与环境变量有什么区别与联系。

    1.在下图中,我们在命令行上定义了一个变量myval,然后我们通过echo指令去查看这个变量的值,也能查看到,值为123,但是当我们用env查找时发现,没有找到这个环境变量。那么实际上myval就是一个本地变量。
    在这里插入图片描述
    2.那么如何将本地变量导成环境变量呢?—利用export命令,设置新的环境变量,这时利用env就能查看到我们已把这个本地变量设置成了环境变量
    在这里插入图片描述
    3.set查看本地变量,unset取消环境变量
    在这里插入图片描述

    环境变量,或者称为全局变量,存在与所有的shell中,在你登陆系统的时候就已经有了相应的系统定义的环境变量了。Linux的环境变量具有继承性,即子shell会继承父shell的环境变量,并且本地变量只在当前进程(base)内有效。本地变量不会被子进程所继承。

    四.获取环境变量的三种方式

    1.getenv()函数获取环境变量

    getenv()函数
    1.头文件
    2.函数声明如下:
    char* getenv(const char* name)
    3.函数名称解析:get:获取,env:nvironment Variable 环境变量,合起来就是获取环境变量
    4.参数与返回值:参数是我们要获取的环境变量名称的字符串,如果该环境变量不存在,则返回NULL,如果所要查找的环境变量存在,则返回char*。即字符串,也就是所获取到的环境变量的值(环境变量是操作系统的全局变量,实际上是个字符串)。

    实例演示:如何使用getenv()函数
    这是在家目录下的nan用户下,写的一份代码
    在这里插入图片描述
    当我们执行这份代码,获取到了环境变量USER,当前用户是nan
    在这里插入图片描述

    当我su - 切换到root用户下,再到我们的家目录下执行这份代码,会发现这个代码程序帮我获取到了环境变量USER,当前的用户是root
    在这里插入图片描述
    那么USER环境变量最大的意义就是:可以标识当前的使用Linux用户。
    我们知道我们使用某些指令时,得到的结果是Permission denied,即我们没有这个权限使用某些指令,例如我们想cd到家目录下的某一用户(当前用户非root),就会出现这样的警告,结论:很多命令都存在身份认证这一环节,就是通过USER环境变量去操作的。我们用代码也可以简单实现。
    在这里插入图片描述

    2.利用命令行参数

    首先我们先得理解什么是命令行参数

    (1)C语言的main函数通常含有参数argc和argv,写法通常如下:

    int main(int argc,char *argv[])
    int main(int argc,char **environ[])
    
    • 1
    • 2

    argc : 命令行传入参数的总个数
    argv : *argv[]是一个指针数组,里面存放的指针指向所有的命令行参数,argv[0]指向程序的全局路径,argv[1]指向在DOS命令行中执行程序名后的第一个字符串,argv[2]指向第二个。

    (2)我们来看在Linux下的一段代码:
    在这里插入图片描述
    执行结果:
    在这里插入图片描述
    (3)解析:实际上我们在命令行上输入的命令,是一个长字符串,例如:
    “ls -a -d”,那么它们会被分隔成小的子串,即"ls" “-a” “-d”,然后被存放在char* argv[]这个指针数组中,argc就是子串的个数

    (4)那么命令行参数在Linux中存在的意义是什么呢?有什么用途呢?
    我们来看以下代码:(这里只显示了代码主干内容,头文件及其它不表)xia
    执行结果:
    在这里插入图片描述

    从这个代码可以得知,我们在命令行上使用的命令,命令行选项,跟argc(命令行参数个数),char* argv[ ]指针数组中存的命令子串息息相关。所以知道了这一点之后,我们也可以给我们的的程序带上命令行选项,不同的选项实现该程序不同的功能。

    (5)最后我们引出这个,命令行参数获取环境变量的方法、
    在这里插入图片描述

    在这里插入图片描述

    3.利用第三方变量

    那么如果我们就是不想用main函数的参数进行获取环境变量,那么我们还有一个解决方法:C语言定义了一个environ变量,它是全局的环境变量的指针,char** environ,变量是一个char** 类型,存储着系统的环境变量。

    使用方法:

    • 头文件:unistd.h
    • 因为environ是一个全局的外部变量,所以切记使用前要用extern关键字进行声明,然后在使用。
    #include 
     
    extern char ** environ;
     
    int main()
    {
        char ** envir = environ;
        
        while(*envir)
        {
            fprintf(stdout,"%s",*envir);
            envir++;
        }
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
  • 相关阅读:
    OSPF的接口网络类型
    探索性数据分析EDA的数据可视化
    解决idea启动tomcat控制台中文乱码
    05 Spring整合MyBatis
    【SpringCloud-学习笔记】Eureka注册中心
    hub.docker访问不了的问题(一步解决)
    [附源码]Python计算机毕业设计Django基于Java酒店管理系统
    JavaScript 69 JavaScript Web API 69.3 Web History API
    腾讯云服务器CVM和轻量应用服务器区别全方位对比
    涂鸦智能物联网平台初探
  • 原文地址:https://blog.csdn.net/weixin_63449996/article/details/128052059