环境变量

🚩概念

环境变量指操作系统用来指定在操作系统运行环境的一些参数
比如:我们在编写C/C++代码时,链接时,我们不知道动静态库链接在哪,但是还能够运行,里面就有环境变量帮助编译器查找
🚩环境变量具有全局属性(可以被子进程继承)

查看环境变量

echo $环境变量名

echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/jib/.local/bin:/home/jib/bin

🚩PATH

PATH:指令搜素路径
🚩为什么我们自己的可执行程序必须要加 ./ 而有些程序直接输入就行 ls ll 这种

因为这些程序已被放入系统搜素路径中,可以直接搜素到而./翻译过来就是找到当前路径

那么怎么将mycode加入指令搜索路径

export PATH=$PATH:路径

export PATH=$PATH:/home/jib/1010/environment

HOME,USER

系统怎么知道进哪个路径,HOME
在这里插入图片描述

和环境变量相关的命令

  • echo 显示一个环境变量
  • export 设置一个环境变量
  • env 显示全部环境变量
  • unset 取消一个环境变量
  • set: 显示本地定义的shell变量和环境变量

环境变量组织形式

在这里插入图片描述

🚩命令行参数

main函数也是有参数的,只不过我们用的时候操作系统调用Startup(),CRTStartup()函数为我们搭建了C/C++环境

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
using namespace std;
int main(int argc,char* argv[])
{
    for(int i=0;i<argc;i++)
    {
        printf("argv[%d]-> %s \n",i,argv[i]);
    }
    //printf("%s ",getenv("MYVAL"));
    if(argc >= 2)
    {
    if(strcmp(argv[1],"help")==0)
    {
        printf("帮助\n");
    }
    if(strcmp(argv[1],"-a")==0)
    {
        printf("功能a\n");
    }
    }
    printf("");
    return 0;
}

命令行输入的字符串进入**argv
在这里插入图片描述
也可以像ls -a,ls -l这样
在这里插入图片描述
在这里插入图片描述

获取环境变量

命令行第三个参数

main还有第三个参数,环境变量表
打印

int main(int argc,char* argv[],char* env[])
{
    for(int i=0;i<argc;i++)
    {
        printf("argv[%d]-> %s \n",i,argv[i]);
    }
    for(int i=0;env[i];i++)
    {
        printf("env[%d]->%s",i,env[i]);
    }
    //printf("%s ",getenv("MYVAL"));
    if(argc >= 2)
    {
    if(strcmp(argv[1],"help")==0)
    {
        printf("帮助\n");
    }
    if(strcmp(argv[1],"-a")==0)
    {
        printf("功能a\n");
    }
    }
    printf("");
    return 0;
}

在这里插入图片描述

第三方变量environ

extern char** environ;
    for(int i=0;environ[i];i++)
    {
        printf("environ[%d]->%s",i,environ[i]);
    }

environ这个全局变量是C在运行库定义的,不是在程序中定义的
extern作用:这个environ不是在文件中定义的,链接的时候会找到它

🚩系统调用或设置环境变量

getenv获取一个环境变量

printf(“%s\n”,getenv(“PATH”));
printf("%s\n ",getenv(“MYVAL”));

在这里插入图片描述

export设置环境变量

export MYVAL=“hello”

在这里插入图片描述
🚩环境变量被子进程继承了
我们运行的进程都是子进程bash运行时,操作系统会从配置文件中找到环境变量,子进程继承父进程环境变量

若是没有export呢?

在这里插入图片描述
打印没打出来,但是echo又能找到

🚩内建命令常规命令

运行的进程都是子进程吗?也有例外
因为echo根本就没有创建子进程
export影响shell所有子孙后代,没有export,./mycode创建子进程就继承不了MYVAL
没有export说明只是在该进程设置了环境变量,echo也没有创建子进程,在该进程中找到了MYVAL

两批命令:

  • 常规命令(外部命令):通过创建子进程实现,大部分指令都是常规命令,ls,vim,grep
  • 内建命令:bash不创建子进程,通过自己实现,bash调用了自己的写的或系统提供的函数,如pwd echo

内建命令作用
有些指令必须要内建命令实现,常规命令创建子进程不影响父进程cd指令我们要影响shell本身,如果是常规命令,创建子进程然后退出,目录就会没变,所以cd必须是内建命令

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐