【Linux】环境变量

Windows和Linux下的环境变量

Windows下的环境变量

Linux下的环境变量

#include<stdio.h>

int main()
{       
        for(int i = 0; i < 10; ++i)
        {
                printf("linux %d\n", i);
        }       
        return 0;
}   

是因为指令保存在系统中的/usr/bin/路径下


PATH查找指定命令的搜索路径

  • 输入指令echo $PATH——打印PATH里的路径
  • 执行pwd、ls等指令的时候,系统会在PATH中的路径中一个一个查找。
  • 我们自己编写的程序不在系统指定的默认路径下,不带./系统无法在路径中找到,而./代表当前路径,所以系统可以在当前路径下找到这个程序并运行。


PATH:Linux系统的指令搜索路径


想让我们自己的程序在运行的时候不需要带路径有两种方式:

  1. 让程序保存在系统默认的指定路径中
  2. 将程序所在的路径保存在PATH这个指令搜索路径中

  • 上面使用的是添加路径的指令:PATH=$PATH:....(路径)
  • 但是如果将指令写成:PATH=(路径) ,就变成了覆盖系统默认的路径

此时系统中的绝大部分指令都不能运行了,系统无法在指定的PATH路径中找到对应的指令了

Windows中也有PATH来保存指令的默认搜索路径

PATH:系统指令命令的搜索路径

环境变量HOME

  • HOME:用户登陆到Linux系统中的默认目录,是指定用户的主工作目录的
  • root用户:/root
  • 普通用户:/home/用户名

环境变量SHELL

当前的shell环境,通常是/bin/bash

与环境变量相关的命令

  1. echo:显示某个环境变量值
  2. export:设置一个新的环境变量
  3. env:显示所有环境变量
  4. unset:清除环境变量
  5. set:显示本地定义的shell变量和环境变量

pwd指令不被保存在PATH系统默认指令存放的地方,而是放在PWD这个环境变量中,所以清空PATH,也不会影响指令pwd

getenv()使用系统调用接口获取环境变量

int main()
{       
        printf("PATH:%s\n",getenv("PATH"));
        printf("PWD:%s\n", getenv("PWA"));
        
        return 0;
}

  • 此时,就可以获取到环境变量PATH和PWD
  • 同时,不同的用户(root、普通用户)执行获取环境变量的接口,会得到不同的环境变量。
int main()
{
        char who[32];
        strcpy(who, getenv("USER"));
        if(strcmp(who, "root") == 0)
        {
                // root用户
                printf("允许root用户进行操作!\n");
        }
        else
        {
                // 普通用户
                printf("不允许普通用户进行操作!\n");
        }

        
        return 0;
}

有了环境变量的存在,系统可以识别环境变量,并因此进行一些相关的操作

环境变量的概念

【总结】环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用途,通常具有全局属性

命令行参数

在主程序中,main函数是带有参数的:

  • int main(int argc, char* argv[]){ }
  • argc是argc这个指针数组的元素
  • argv是一个指针数组,这个数组里面保存的是字符串的地址,是一个向量表
  • argc、argc就是命令行参数
int main(int argc, char* argv[])
{       
        for(int i = 0; i < argc; ++i)
        {
                printf("argv[%d]->%s\n",i,argv[i]);
        }
        
        return 0;
}

  • mian()函数也是函数,mian()并不是第一个运行的函数,也会被其他函数调用,也会传递参数。
  • 命令行参数以空格为分隔符,将传递的内容分成几份,argc表示分割成几个部分,argv表示这几个字符串的地址

写一个指令demo

int main(int argc, char* argv[])
{
        // 表示指令只运行携带一个参数
        if(argc != 2)
        {
                printf("Usage: %s -[a|b|c|d]\n", argv[0]);
                return 0;
        }

        // 指令携带四个选项,每个选项执行一个功能
        if(strcmp(argv[1], "-a") == 0)
        {
                printf("功能a\n");
        }
        else if(strcmp(argv[1], "-b") == 0)
        {
                printf("功能b\n");
        }
        else if(strcmp(argv[1], "-c") == 0)
        {
                printf("功能c\n");
        }
        else if(strcmp(argv[1], "-d") == 0)
        {
                printf("功能d\n");
        }
        else
        {
                printf("default\n");
        }

        
        return 0;
}

这里类似于指令携带选项操作,所有的相同的指令携带不同的选项都是同一个指令,只是功能不同

  • 命令行参数的一个特殊用途:为指令、工具、软件等提供命令行选项的支持!

main()函数还有第三个参数:int main(int argc, char* argv[], char* env[]) { }

  • env也是指针数据,保存字符串的地址
  • env和argv是类似的,是系统中两张核心向量表,argv是命令行参数表,env是环境变量表

        int cur = 0;
        while(env[cur])
        {
                printf("env[%d]->%s\n",cur,env[cur++]);
        }

  • main函数在执行的时候,系统会将argv和env这两张向量表传递进来。
  • 我们所运行的进程,都是子进程,bash进程在启动的时候,会从操作系统的配置文件中读取环境变量信息,子进程会继承父进程交给自己的环境变量
  • 所以环境变量具有全局属性

设置与取消环境变量

本地变量

自己设置的变量并不会存放在系统的环境变量中。

  • set 命令可以查找系统中所有的变量,包括环境变量、本地变量

本地变量,只会在本bash进程中有效,不会被子进程所继承

内建命令

问题:echo为什么会打印出本地变量

echo也是一个指令,由于本地变量不会被子进程所创建,那么echo是如何得知本地变量的?


【注意】命令行上所有的指令并不是都需要创建进程


命令主要分为两部分:

  1. 常规命令——通过创建子进程完成的
  2. 内建命令——bash不创建子进程,而是由自己亲自执行,类似于bash调用自己写的,或者系统提供的函数

内建命令有cd、echo等,系统中有一个接口:int chdir(const char *path);修改工作目录

使用此函数可以修改该进程当前的目录。

而bash进程在执行cd [路径]的时候,只需要使用chdir函数,修改当前进程的当前目录即可。

不使用命令行参数获取环境变量

使用系统提供的第三方变量:extern char **environ;

总结环境变量的概念

        环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数,环境变量在系统中具有全局属性。例如:在编写代码的时候,有个过程称为链接,虽然我们不需要知道链接的动态静态库在哪里,但是照样是可以链接成功生成可执行程序,原因就是有相关的环境变量来帮助编译器进行查找。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值