• Linux——环境变量


    ✅<1>主页::我的代码爱吃辣
    📃<2>知识讲解:Linux——环境变量
    ☂️<3>开发环境:Centos7
    💬<4>前言:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数

    目录

    一.基本概念

    二.Linux系统中常见的环境变量

    1.查看指定的环境变量

    2.PATH

    3.HOME

    4.SHELL

    三.环境变量的组织方式

    四.添加环境变量

    五.环境变量的继承

    六.获取环境变量

    1.命令行第三个参数

    2.通过第三方变量environ获取

    3.通过系统调用获取或设置环境变量


    7a61ce1356d74782994d4efa4c5c05a3.gif

    一.基本概念

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

     查看当前LInux系统的环境变量:

    指令:

    env

    3c10b182cd8d49d0b964814e3569eeee.png

    windows下的环境变量:

    89b89b26277c49bb90b2e0adae44a661.png

    环境变量本质就是一种变量,一种K/V的对用关系,由变量名和变量值。

    二.Linux系统中常见的环境变量

    1.查看指定的环境变量

    echo $NAME #NAME:环境变量名称

     例如:

    f73757a50dec4c8cafe6e7e39870f1b3.png

    2.PATH

    指定命令的搜索路径.

    1. 我们平时写的一些C/C++代码,编译成可执行程序以后,通过 ./ 运行,本质是告诉操作系统可执行程序的位置。
    2. 但是系统自带的指令,本质也是C语言写的程序,为什么系统的指令不需要指定路径呢?
    3. 就是因为环境变量PATH里面存储了指定命令的搜索路径。

    75ad94f3687b410480e5203e4426c503.png

    3.HOME

    指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。

    当我们每次登录系统的时候,系统就会记录下登录用户,并且填充HOME环境变量,并且创建bash进程帮我们执行 cd /home/XXX 的命令,进入我们自己的家目录,这就是我们为什么一进入系统,默认就在自己的家目录里。

    普通用户:

    40cb2a5877d040eaad31711f8e8a6dbe.png

    root用户:

    53ab012213b343babe2a9d6c4f4315c7.png

    4.SHELL

    当前Shell,它的值通常是/bin/bash。ab1c980112e04ee09ad78f623913692e.png

    三.环境变量的组织方式

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

    b0e6134e0e6d459dbb5a5524829c4d8f.png

    四.添加环境变量

    我们刚刚介绍了PATH环境变量,指定命令的搜索路径.那么我们可不可以将自己写的可执行程序的查询路径也添加进PATH里,这样我们的可执行程序,也可以实现不需要 ./ 就可以直接执行了。

    测试代码:test.c

    1. #include
    2. #include
    3. int main()
    4. {
    5. int n = 3;
    6. while (n)
    7. {
    8. printf("原神启动:%d\n", n);
    9. sleep(1);
    10. n--;
    11. }
    12. }

    makefile:

    1. ttest:test.c
    2. gcc -o $@ $^
    3. .PHONY:clean
    4. clean:
    5. rm -rf ttest

    14a088b2f8bc4b799af7e50e0bb01065.png

     方法一:

    使用export将我们该可执行程序的路径导入PATH中,后续可以不用加 ./ 就可以直接运行可执行程序,因为操作系统可知直接通过环境变量中的地址找到可执行程序。

    export PATH=路径

    ada3ad6f79ab43bd93ef8790e5b7f691.png

     注意:

    这样会有一个很尴尬的问题就是我们的PATH中只有这一个路径了,即之前的TATH环境变量中的其他路径被我们导入的路径覆盖了。

    我们这样导入环境变量:

    export PATH=$PATH:路径

    694a81209ea445ba808d1c1caa0ef537.png

    方法二:

    将可执行程序拷贝到 /usr/bin目录下,/usr/bin目录就是系统默认的命令存储的路径。

    sudo cp ./ttest /usr/bin

    e3ad4a1a670d46a295cea7b29e6ea865.png

    本质将可执行程序放进/usr/bin目录下的过程,就是软件安装的过程。

    上述这种添加变量的方式,就是将命令添加到系统环境中,还有一种添加变量的方式是将变量添加到本地,这种变量我们称之为本地变量。

    例如:

    hello=100

    这就是添加了一个本地变量。

    五.环境变量的继承

    1. 环境变量是可以被子进程继承的。
    2. 我们使用 export 导入的进程,就可以使用 echo 命令查询得到,echo 本质也是一个程序,之所以echo 可以查询到我们导入bash的环境变量本就是,echo 继承了bash的环境变量。
    3. 但是仅仅只是环境变量可以被子进程继承,本地变量是不可以子进程继承。

    六.获取环境变量

    1.命令行第三个参数

    我们先看看命令行参数:

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

    注意:

    1. argv是一个指针数组,数组每一个元素都是一个char*,每一个char*都指向了一个字符串。
    2. argc是argv数组的元素个数。

    8407ea7cb1bf4ea7abc5056757fb469a.png

     注意:

    1. argv数组存储的就是我们命令行输入的以空格为分隔的字符串。
    2. 顺序是从左往右

     命令行的第三个参数:

    测试代码:

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

    运行结果:

    496f368403354f68819c9ba752f29baf.png

    注意:

    1. env也是一个指针数组,每一个数组元素存储的就是一个环境变量。
    2. 证明了环境变量是可以被子进程继承的。
    3. 应证了环境变量的组织方式。

    2.通过第三方变量environ获取

     测试代码:

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

    运行结果:

    e280833dafd3423f903c305a7ad851b8.png

     注意:

    • libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。

    3.通过系统调用获取或设置环境变量

    系统调用:

    getenv()

    502fc585063149a8b71ab0932172b34c.png

    efe99ed2bc7d45c095fbadc968afcdf7.png

    getenv参数是环境变量名,返回的是环境变量值字符串,如果没找到对应的环境变量,就返回NULL。

    测试代码:

    1. [wq@iZuf6hzw565sb02fomef99Z 23_9_12]$ HELLO=100#本地变量
    2. [wq@iZuf6hzw565sb02fomef99Z 23_9_12]$ export MYHELLO=100#环境变量
    1. #include
    2. #include
    3. int main()
    4. {
    5. if (getenv("PATH"))
    6. {
    7. printf("PATH:%s\n", getenv("PATH"));
    8. }
    9. if (getenv("MYHELLO"))
    10. {
    11. printf("MYHELLO:%s\n", getenv("MYHELLO"));
    12. }
    13. if (getenv("HELLO"))
    14. {
    15. printf("HELLO:%s\n", getenv("HELLO"));
    16. }
    17. return 0;
    18. }

    dc57dac148254096b1bc1703ab7666cc.png

    2e3b14b87fd344c4a4e0ed702a59da45.png

     注意:

    1. 环境变量通常具有全局属性,可以被子进程继承下去。
    2. 我们之前说过本地变量不会被子进程继承,上面的代码也可以看出来。
    3. 但是为什么使用命令echo就可以查询到本地变量?因为echo是内建命令。

     

     

     

  • 相关阅读:
    mysql 到底是 join性能好,还是in一下更快呢
    微服务(十六)——Seata 分布式事务框架
    EtherCAT主站SDO读报文抓包分析
    网络工程师 ---- 常见的查看命令
    MATLAB中zticks函数用法
    C语言整理(待更新)
    简单学习LVM、LVM的实践、通俗易懂的LVM
    【linux下vscode头文件出现无法跳转的问题解决方案】【includepath波浪线】
    130、★LeetCode-115.不同的子序列
    java毕业设计便捷式管理系统mybatis+源码+调试部署+系统+数据库+lw
  • 原文地址:https://blog.csdn.net/qq_63943454/article/details/132817786