【Linux】环境变量详解

1.环境变量分类

  • 按生命周期划分:

    • 永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效。
    • 临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。
  • 按作用域划分:

    • 系统环境变量:公共的,对全部的用户都生效。
    • 用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

2.环境变量相关指令

env:查看当前用户全部的环境变量
在这里插入图片描述

env | grep 环境变量名:筛选包含的环境变量

在这里插入图片描述

exprot :显示当前系统定义的所有的环境变量

在这里插入图片描述

printenv 环境变量名:查看指定环境变量的值

在这里插入图片描述

echo $环境变量名:查看指定环境变量的值

在这里插入图片描述

unset 环境变量名:清除指定环境变量

3.常用的环境变量

PATH

功能和作用

可执行程序的搜索目录,可执行程序包括Linux系统命令和用户的应用程序。如果可执行程序的目录不在PATH指定的目录中,执行时需要指定目录。

书写格式

PATH环境变量存放的是目录列表,目录之间用冒号:分隔,最后的圆点.表示当前目录。

export PATH=目录1:目录2:目录3:…目录n:.

PATH缺省包含Linux系统命令所在目录(/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin),如果不包含这些目录,Linux的常用命令也无法执行(要输入绝对路径才能执行)。

在这里插入图片描述

通过图可以看到,当PATH里没有了系统默认目录时,ls命令就不可直接使用了,必须要使用绝对路径才能使用,如下图:

在这里插入图片描述

想在PATH环境变量中增加其他的路径的方法:

export PATH = PATH:/其他的路径

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

普通用户和root用户的区别

在这里插入图片描述

SHELL : 当前Shell,它的值通常是/bin/bash

在这里插入图片描述

4.环境变量的组织方式

在这里插入图片描述

每个程序都有一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

5.获取环境变量

main 函数的形参列表最多可以带有 3 个参数,分别为 argc 、 argv 、 envp :

int main(int argc,char* argv[],char* envp[]){}

其中 char* envp[] 是一个指针数组,该数组里面的指针都分别指向不同的字符串,并且最后一个指向有效字符串的指针的下一个指针一定指向 “NULL”,如下图:

在这里插入图片描述

下面编译一段代码:

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

结果:

在这里插入图片描述

发现这些指针指向的就是一个一个环境变量字符串。
讲到这里,我们的C/C++素养让我们意识到当函数传参数组时,传递的不是数组本身,而是数组首元素地址,所以在 main 函数的形参列表中写成的 char* envp[] 形式,本质上是一个二级指针,名为 environ ,查看一下 man 手册:

man environ

在这里插入图片描述

以后想要获取环境变量就可以通过遍历这个表状结构体获取了。
但是这样做的话太过于麻烦,为了方便起见,主流的获取环境变量的方法是通过函数获取,该函数名为 getenv 。
使用 man 手册查看该函数:

man getenv

在这里插入图片描述

用法就是:

getenv(环境变量名)

如下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char*argv[],char*envp[])
{
     char*pwd=getenv("PWD");
     if(pwd==NULL)
         perror("getenv error");
     else 
         printf("%s\n",pwd);
    return 0;
}

在这里插入图片描述

和预期结果一样。

补充:环境变量具有全局属性,可以被子进程继承。

在这里插入图片描述

通过上图我们可以发现,当使用export创建环境变量时,env指令可以查看到这个变量,而当直接创建环境变量时,env却不能查看到,只能用echo $环境变量名 查看,通过上面的现象可以发现,使用export 创建的环境变量被导入了环境表中,该变量称为全局环境变量。而直接创建没有被导入环境表,该变量称为本地环境变量

本地变量不能被子进程继承,在环境表中的全局环境变量可以被继承

为什么echo可以查看到本地变量?

echo属于内键命令,内建命令后面叫。

6.命令行参数

认识了main函数中的一个参数。其它两个也就非常容易理解了。

现在思考一个问题:为什么ls可以使用-a -l这些选项呢?

现在我们写一个程序测试一下我们能否也使用命令行参数吧

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

在这里插入图片描述

命令行参数的应用:

设计一个计算器

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void Usage(const char* name)
{
  printf("\nUsage:%s -[+][-][*][/]\n\n",name);
  exit(-1);
}
int main(int argc,char* argv[],char* envp[])
{
  if(argc!=2) // 必须指定输入一个参数
    Usage(argv[0]);

  int n1 = 0;
  int n2 = 0;
  int ret = 0;
  printf("-----num1 = ");
  scanf("%d",&n1);
  printf("-----num2 = ");
  scanf("%d",&n2);
  if(strcmp(argv[1],"-+")==0) 
    ret = n1 + n2;
  else if(strcmp(argv[1],"--")==0) 
    ret = n1 - n2;
  else if(strcmp(argv[1],"-*")==0) 
    ret = n1 * n2;
  else if(strcmp(argv[1],"-/")==0) 
    ret = n1 / n2;
  printf("\n-----resault = %d\n",ret);
  return 0;
}

结果:

在这里插入图片描述
LInux环境变量的分享就到这了,如有错误还望支持,886!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冧轩在努力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值