Linux环境变量

28 篇文章 2 订阅

在这里插入图片描述

🥐1. 认识环境变量

如果学过JAVA、Mysql的话,我们都需要在系统中配置环境变量

image-20230901123240334

那这些变量有什么用呢?

🥖1.1 PATH

我们先来做一个实验:

先写一段代码,然后生成可执行文件

image-20230901123530066

如果我们要运行这个可执行文件,前面必须要加上./mycmd才能运行,如果不加上,则会显示没有找到这个命令

image-20230901123628297

而系统的一些指令,却不用加,可以直接使用,这是因为在Linux中对于指令的搜索,系统会提供一个环境变量PATH,我们登录xshell的时候就天然存在了。

可采用指令echo $PATH查看环境变量

image-20230901123926594

这些是由一串路径,然后以:作为分隔符再跟上另一段路径,这些路径就是我们执行指令的时候,系统查找指令的路径。

image-20230901124207439

如果在这些路径下找到了,则执行这个指令,如果没找到则继续往后查找,查找完了还没找到,则显示command not found。所以我们刚刚生成的可执行文件,并不在这个路径里面。

那按这个道理来说,我们把我们的程序添加到环境变量当中去,那就不用带路径了,可以和指令一样直接使用,指令:PATH=$PATH:当前路径

image-20230901124835921

添加完成之后,我们就可以像使用指令一样,直接运行我们的程序

image-20230901124924502

添加环境变量的时候,不可以直接PATH=路径,例如PATH=/home/Pyh/linux/study/9-1

这样会直接覆盖之前的环境变量,导致系统找不到指令路径

image-20230901125132942

当然,这样不用担心,我们重新登录一下即可,因为我们所改的环境变量是内存级别的环境变量,保存在shell中,如果启动的时候shell没有这个环境变量,系统会重新加载到内存。

image-20230901125545140

🥖1.2 HOME

当我们登录xshell的时候,会默认进入到我们的家目录

image-20230901130325993

这是因为shell会识别这个账号是谁,然后填充对应的$HOME这个环节变量

🥖1.3 查看环境变量

系统中有许多环境变量,我们可以用指令env查看我们当前进程所从系统中继承的环境变量

image-20230901130956128

我们也可以提供系统调用接口getenv来获取我们环节变量

image-20230901131748378

image-20230901132005224

🥯2. 什么是环境变量

有了上面的了解,我们可以知道,环境变量是提供一组name = value形式的变量,不同的环境变量,有不同的用户,通常具有全局属性

🍖3. 命令行参数

在某些地方,可能会见过C/C++的main函数会带参数:int main(int argc,char* argv[]),这些我们在Windows开放环节基本没用过,但在Linux里面会经常用到。

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

生成可执行程序,然后运行,我们发现我们后面带上类似-a -b -c之后,会对应输出

image-20230901211216932

其实在bash看来,我们输入只不过是是一串字符串“./mycmd -a -b -c”,bash做命令行解释的时候,会将这个字符串以空格为分隔符打散,然后再传给main函数

image-20230901211938952

这样做是为什么呢?看下面的demo

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[])
{
  int i = 0;
  if(argc != 2)
  {
    printf("Usage: %s -[a|b|c|d]\n",argv[0]);
    return 0;
  }
  if(strcmp(argv[1],"-a") == 0)
  {
    printf("功能1\n");
  }
  else if(strcmp(argv[1],"-b") == 0)
  {
    printf("功能2\n");
  }
  else if(strcmp(argv[1],"-c") == 0)
  {
    printf("功能3\n");
  }
  else if(strcmp(argv[1],"-d") == 0)
  {
    printf("功能4\n");
  }
  else
  {
    printf("default功能\n");
  }
  return 0;
}

生成可执行程序,然后运行

image-20230901212941090

这种操作就模拟了我们的指令操作带上不同的选项,指令本质上是同一个指令,但是根据不同的选项,可以有不同的功能

所以命令行参数,可以为指令、软件、软件等提供命令行选项的支持。

image-20230901213139055

其实main函数不止有这两个参数,还能带上环境变量参数char* env[],它也是一个指针数组,也就是说我们的C/C++代码其实有2张核心向量表命令行参数表、环境变量表

我们可以通过这个参数,遍历到我们所以的环境变量

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

这些环境变量的显示,本质上也字符串,bash将这些分割了而已

image-20230901214154211

我们这个程序运行之后,是bash的子进程,这些环境变量都是bash在启动的时候从操作系统的配置文件里面读取的,而它的子进程,可以继承它的环境变量。

所以这就能证明上面所说的环境变量具有全局性!

当然了,我们也可以验证一下,我们添加自己的环境变量到bash当中:

export MY_ENV=11223344

image-20230901215127035

这个操作过程中,没有对程序进行任何修改,然后重新运行刚才的程序

image-20230901215231259

验证完毕之后,把这个环境变量给去掉,采用指令unset MY_ENV

image-20230901215346041

Tips:

如果main函数不添加参数,可采用C语言提供的接口extern char** environ获取

image-20230901222642534

image-20230901222935852

🍔4. 本地变量 && 内建命令

除了有环境变量,还有本地变量,我们直接在命令行中输入

image-20230901215844635

我们也可以采用set命令查看本地变量和环境变量

image-20230901220333516

这些本地变量只在本bash内部有效,不会被继承,这个也是可以进行验证

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(int argc,char* argv[],char*env[])
{
    printf("MY_ENV: %s\n",getenv("MY_ENV"));
    return 0;
}

然后我们添加一个名为MY_ENV的本地变量

image-20230901220910793

验证发现并没有继承下来,然后可以将本地变量导成环境变量export MY_ENV

image-20230901221037820

那这里还有一个疑问,那就是既然说这些指令都是属于bash的子进程,那么这个程序也是bash的子进程,那为什么我们写的这个程序用getenv()获取不到本地变量,而echo这个子进程却可以拿到本地变量呢?

这其实是因为,命令行上所启动的指令,不一定要创建子进程,我们可将命令分为两类:

  1. 常规命令:通过创建子进程完成

  2. 内建命令:不创建子进程,由自己亲自执行,类似于bash调用自己写的函数或系统提供的函数(cdecho命令)

    模拟cd命令:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    int main(int argc,char*argv[],char*env[])
    {
     sleep(10);
     printf("begin:\n");
     if(argc == 2)
     {
       chdir(argv[1]);
     }
     printf("end\n");
     sleep(10);
     return 0;
    }
    

    cd


那本次分享就到这里了,我们下期再见,如果还有下期的话。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加法器+

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值