首页 > 其他分享 >环境变量与本地变量

环境变量与本地变量

时间:2024-11-04 16:17:12浏览次数:4  
标签:shell 变量 用户 include 本地 main 环境变量

环境变量

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

PATH

指定命令的搜索路径,所谓的指令其实就是一个可执行程序,而这个可执行程序统一被放置在一个路径/usr/bin下面,也就是说,当我们把某一路径添加到PATH后,系统会自动从这些路径中去找寻对应的可执行文件并运行

可以看见当我们修改了PATH,去掉了/usr/bin之后,指令ls无法运行了,只有当指定了绝对路径之后才能继续运行

注意:普通用户修改环境变量时只有本次登录生效,重新登录后,PATH会恢复,这是因为PATH这个环境变量,它是有备份在系统的,当系统启动的时候,会给PATH重新赋值(也就是重新加载一遍配置文件),而这个备份(配置文件)就在家目录的.bash_profile中

USER

显示当前账号

SHELL

显示默认的命令行解释器

HOME

显示的是指定用户的主工作目录(即用户登录到Linux系统的默认目录)

查看系统的全部环境变量:env,set

  • set:set命令显示当前shell的所有变量,包括环境变量、本地变量以及shell特有的变量。这些变量不仅局限于用户的环境变量,还包括与shell会话相关的其他信息,如shell的功能选项和状态信息。
  • env:env命令仅显示环境变量,也就是那些被导出供子进程使用的变量。这些变量通常包括系统路径、用户信息等,对于定义程序运行环境至关重要。

重新认识main函数

#include<stdio.h>
int main(int argc, char* argv[], char* envp[])
{
    int i=0;
    printf("argc:%d\n",argc);
    printf("----------------------------------\n");
    for(i=0;i<argc;i++) printf("argv[%d]:%s\n",i,argv[i]);
    printf("----------------------------------\n");
    for(i=0;envp[i];i++) printf("envp[%d]:%s\n",i,envp[i]);
    return 0;
}

main函数原本是有三个参数:argc:表示的是传入程序的元素数量,argv:传入程序中的元素表,由bash制作,传给main函数,envp[]环境变量表,所谓全局性就是指main函数通过此参数获取到的环境变量表的信息,也就是env显示的环境变量(最后一个环境变量是当前的运行可执行文件的路径)

环境变量表

在每个进程启动的时候都会收到一个环境遍历表,用于记录与当前进程有关的环境变量信息,这个环境变量表采用的是字符指针数组的形式进行存储,然后使用全局变量char** envrion来记录环境变量表的首地址,使用NULL来表示环境表的末尾:

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char* argv[])                                                                                                                                         
{
    extern char **environ;
    int i=0;
    for(i = 0; environ[i]; i++)
    {
        printf("environ[%d] -> %s\n", i, environ[i]);                                                                                                                                      
    }
    return 0;
}

结论:main函数的形参列表中写成的char* envp[]形式本质上是一个二级指针,也就是environ,而环境变量具有全局属性,程序运行时,环境变量表会传递给程序使用

环境变量的全局性:环境变量的本质上就是内存级别的一张表,这张表在用户登录系统的时候,由系统给用户单独形成,每一个环境变量都有不同的作用,许多的环境变量存储着用户的个人信息,不同的用户的环境变量表各不相同。

获取特定环境变量:getenv()

#include <stdio.h>
#include <unistd.h>
#include<assert.h>
#include<stdlib.h>
 
int main()                                                                                                                                         
{
    char *PWD=NULL;
    PWD=getenv("PWD");
    assert(PWD!=NULL);
    printf("%s\n",PWD);
    return 0;
}

本地变量

当用户登录Linux系统时,操作系统会自动给用户创建一个shell,用来为该用户提供命令行解释。shell本身是一个进程,会在shell中维护一张环境变量表。而用户在执行命令时,都是命令行解释器shell帮用户执行,对应到Linux系统下,就是bash在执行。bash除了可以执行命令外,还可以命令行式的自定义变量:

在命令行中写下指令 my=100 后,shell读取到指令,就会在内存中申请一块空间,并把该变量以字符串 "my=100" 的形式存放进去,最后在shell内部另外生成一个指针指向该字符串。

myval 是在命令行中定义的,只是前面没有加上 export ,所以 myval 虽然存在,但是并没有被导入表状结构中,这种变量被称为本地变量。

环境变量相对也就是本地变量,针对当前用户的当前进程生效,是一种临时变量,退出本次登陆后就失效了。

结论:本地变量只在当前的bash进程,也就是shell会话内部生效,并不被子进程所继承,也就是说本地变量与环境变量相比,不具备全局属性,而要想本地变量具备全局属性,就得把它定义为环境变量。

标签:shell,变量,用户,include,本地,main,环境变量
From: https://blog.csdn.net/2301_79991997/article/details/143486572

相关文章

  • 用 C# 实现检测系统环境变量 “Path” 中是否有某个值,没有就添加的方法
    用C#实现检测系统环境变量“Path”中是否有某个值,没有就添加的方法:usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading.Tasks;namespaceEnvironmentVariablePathChecker{classProgram{......
  • 鸿蒙Next应用本地化:多语言社交应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言社交应用方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、应用场景......
  • 鸿蒙Next应用本地化:多语言新闻阅读应用
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言新闻阅读应用方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、应用......
  • 鸿蒙Next应用本地化:多语言电商平台
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)在开发多语言电商平台方面的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。一、应用场景......
  • python的变量
       python的变量有 int 整型, float 浮点数(小数),  str 字符,bool 布尔型   int指整数,该变量的类型为整数   float指小数,该变量的类型为小数   str指字符,该变量的类型为字符   bool指布尔,用于判断命题的真假,判断的情况:   1,......
  • 多特征变量序列预测(八)基于麻雀优化算法的CEEMDAN-SSA-BiLSTM预测模型
    往期精彩内容:时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较全是干货|数据集、学习资料、建模资源分享!EMD变体分解效果最好算法——CEEMDAN(五)-CSDN博客拒绝信息泄露!VMD滚动分解+Informer-BiLSTM并行预测模型-CSDN博客风速预测(一)数据集介绍和预处理_风......
  • 本地uni-app链接阿里云esc实例上的mongo
    1.准备工作1.1获取阿里云ESC实例推荐使用阿里云ESC,因为可以免费试用很爽阿里云试用<—点我跳转阿里云确保实例已预装MongoDB<—点我看怎么安装1.2连接到ESC实例这里参考阿里云自带的文档们阿里云ESC文档<–点这里看文档给esc开3000端口<–点击看如何开端口开出方......