• 冰冰学习笔记:初识环境变量


    欢迎各位大佬光临本文章!!!

     

    还请各位大佬提出宝贵的意见,如发现文章错误请联系冰冰,冰冰一定会虚心接受,及时改正。

    本系列文章为冰冰学习编程的学习笔记,如果对您也有帮助,还请各位大佬、帅哥、美女点点支持,您的每一分关心都是我坚持的动力。

    我的博客地址:bingbing~bang的博客_CSDN博客https://blog.csdn.net/bingbing_bang?type=blog

    我的gitee:冰冰棒 (bingbingsupercool) - Gitee.comhttps://gitee.com/bingbingsurercool


    系列文章推荐

    冰冰学习笔记:《gcc、gdb等工具的使用》

    冰冰学习笔记:《进程概念》


    目录

    系列文章推荐

    前言

    1.常见的环境变量

    2.环境变量的常用命令

    3.环境变量具备全局属性


    前言

            环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,例如,我们使用C++,C语言来编写代码时,我们从来不知道编译时链接的动静态库在哪里,但是依旧可以链接成功,这就得益于环境变量的配置。

    1.常见的环境变量

    常见的环境变量有PATH,HOME,SHELL等,每个环境变量都有自己独特的用处。

    (1)PATH

            PATH环境变量的作用为指定命令的搜索路径。当我们使用系统命令的时候,可以直接输入命令即可,例如ls,pwd等命令。但是当我们自己写的可执行程序就需要带路径,不带路径是不能执行的。

            那么为什么系统命令不需要呢?原因在于环境变量的配置。PATH记录的就是系统在执行命令时去寻找的路径,我们使用的系统命令都放在这些路径中,由于我们自己书写的可执行程序的路径并没有配置到环境变量中,因此必须在执行的时候添加程序的路径,来指定。

            我们可以使用echo命令查看环境变量:echo $name,查看环境变量name。

            那么如果我们将自己的程序路径配置到系统环境变量的路径中是不是就可以直接执行,而不需要指定路径了呢?答案是肯定的,确实可以。

            我们可以使用export PATH=$PATH : 文件目录命令将路径添加到环境变量PATH中。

            我们不用担心自己的设置了环境变量会不会污染系统本身,因为我们自己设置的只在本次登录中有效。 

    (2)HOME

            HOME环境变量为指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。我们登陆不同的用户,系统会根据环境变量来登录不同的工作目录。

     因此我们使用命令cd ~回到主工作目录的时候依赖的就是HOME环境变量。

     (3)SHELL

            当前Shell,通常是/bin/bash

    2.环境变量的常用命令

    echo :显示某个环境变量

    export :设置某个环境变量

    env :显示所有环境变量

    unset :清除环境变量

    set :显示本地定义的shell变量和环境变量

            使用env显示所有环境变量:

            环境变量的组织方式实际上就是一个指针数组,每个指针指向一个以 '\0' 结尾的环境字符串 

            我们查看环境变量的方式不仅可以使用命令实现,我们也可以在代码程序中获得。

    (1)main函数的第三个参数

            main函数中具有三个参数,前两个为命令行参数,第三个为环境变量。因此我们可以在程序中执行下列代码来获取环境变量。而命令行参数存在的意义在于我们可以使用不同的选项来执行一个从程序的不同逻辑(代码在最后附上)。

    1. #include
    2. int main(int argc, char *argv[], char *env[])
    3. {
    4. int i = 0;
    5. printf("begin--------------------\n");
    6. for(; env[i]; i++)
    7. {
    8. printf("%s\n", env[i]);
    9. }
    10. printf("end-----------------------\n");
    11. return 0;
    12. }

             与我们使用env命令获得没有什么差异。

    (2)第三方变量environ
            第三方变量environ是libc中定义的全局变量,指向环境表,它并不包含在任意的头文件中,使用的时候需要用extern声明。

    1. #include
    2. int main(int argc, char *argv[])
    3. {
    4. extern char **environ;
    5. int i = 0;
    6. for(; environ[i]; i++){
    7. printf("%s\n", environ[i]);
    8. }
    9. return 0;
    10. }

    (3)getenv函数

            该函数也能获得某个环境变量,包含头文件后可以直接调用。

    1. #include
    2. #include
    3. int main()
    4. {
    5. printf("%s\n", getenv("PATH"));
    6. return 0;
    7. }

    3.环境变量具备全局属性

            环境变量具备全局属性,可以被子进程继承下去。我们可以用下列代码进行测试。

    1. #include
    2. #include
    3. int main()
    4. {
    5. char * env = getenv("MYENV");
    6. if(env){
    7. printf("%s\n", env);
    8. }
    9. return 0;
    10. }

            直接运行,我们会发现运行失败,因为系统中没有环境变量MYENV。

     

            我们可以在命令行中导入环境变量:export MYENV="hello world"

            当我们再次执行代码后(不用重新编译),发现运行成功了。

            这就说明shell创建的子进程继承了环境变量,环境变量是全局的。 我们直接设置不加export的变量为局部变量。

    附:命令行参数测试代码

    1. int main((int argc, char *argv[])
    2. {
    3. if(argc!=2)
    4. {
    5. printf("至少要有一个选项\n");
    6. }
    7. if(strcmp("-a",argv[1])==0)
    8. {
    9. printf("选项a\n");
    10. }
    11. else if(strcmp("-b",argv[1])==0)
    12. {
    13. printf("选项b\n");
    14. }
    15. return 0;
    16. }
  • 相关阅读:
    一个注解搞定SpringBoot接口定制属性加解密
    gsap的简单用法
    Kotlin 语言基础学习
    Android Studio的安装 环境搭建
    WebSocket小案例(spring-boot-starter-websocket)
    这不会又是一个Go的BUG吧?
    《大数据之路:阿里巴巴大数据实践》-第3篇 数据管理篇 -第13章 计算管理
    nestjs 新手入门第一章从入门到弃坑 解决运行中的启动错误
    系统架构设计师-计算机网络
    准备后端接口服务环境
  • 原文地址:https://blog.csdn.net/bingbing_bang/article/details/126765643