Linux|环境变量

目录

前言

Main参数—命令行参数

命令行解释器:bash

认识环境变量

环境变量的作用

环境变量命令行操作 

代码获取环境变量的用法

环境变量表

环境变量的存放


前言

        环境变量是一个系统预定义的全局参数,系统自己开辟空间,将它存在于所有的Shell中,具有继承性,可以存储有关shell会话和工作环境的信息。

Main参数—命令行参数

        在认识环境变量的功能前,先学习一下命令行参数。在Linux中,在我们启动的非图形化界面时的命令行时,实际上就是bash(或shell)给我们输出的命令行字符串。

命令行解释器:bash

        是一种与计算机系统交互的程序,允许用户通过输入命令的形式与操作系统或软件进行通信。用户通过键盘输入命令,命令行解释器会解析这些命令并将其传递给操作系统或应用程序。根据用户输入的指令,调用系统程序或脚本完成相应的操作。将执行结果或错误信息反馈给用户。平时使用的一些命令如ls,touch,其实都是向bash传递信息,bash去执行对应的操作,理解为帮你完成任务的一个媒介。

        bash输入ls会得到相关信息,其实就是让bash调用了ls的程序。所以不难理解当向在调用ls时候你还传递了-a,-l,这样的参数,说明程序是支持你调用时候传递参数的。调用你自己的程序那么也就可以传参。程序里面基本都有一个main()函数,你通过bash来运行你的程序就是bash在调用程序里的main()函数,那么你输入的参数也由程序的main()函数来就接收,于是引入了int main(int argc,char *argv[],char *env[]),你传递参数也就相当于和你的程序在交互了;

int argc

表示命令行参数的个数。

char *argv[]

 是一个数组,存储每个参数的字符串(如 argv[0] 是程序名(比如ls),argv[1] 是 -a,argv[2] 是 -l)。

char *env[]

是环境变量的数组,用于获取运行环境的信息。当你在运行程序时,程序的进程会获得父进程的环境变量,你可以用这个参数来获取

 #include<stdio.h>
 #include<stdio.h>

 int main(int n, char* news[])
 {
     //以下效果一样
     for (int i = 0; news[i]; i++)
     {
         printf("第%d条参数:%s",i+1,news[i]);
     }
     return 0;
 }

告诉系统你是谁

使用命令行参数的小测试(命令行计算器)

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



int main(int argc,char *argv[])
{
    if(argc != 4)
    {
        printf("Usage:\n\t%s -[add|sub|mul|div] x y\n\n", argv[0]);
        return 1;
     }

    int x = atoi(argv[2]);
    int y = atoi(argv[3]);
    if(strcmp("-add", argv[1]) == 0)
    {
     printf("%d+%d=%d\n", x, y, x+y);
     }
    else if(strcmp("-sub", argv[1]) == 0)
     {
     printf("%d-%d=%d\n", x, y, x-y);
     }
     else if(strcmp("-mul", argv[1]) == 0)
     {
     printf("%d*%d=%d\n", x, y, x*y);
     }
     else
     {
     printf("unknown!\n");
     }
     for(int i = 0; argv[i]; i++)
      {
      printf("argv[%d]: %s\n", i, argv[i]);
      }

    return 0;
 }

编译运行一下:

atoi:(c语言函数)需要包含<stdlib.h>头文件,当参数位置传入的为NULL指针时会报错,当参数位置传入的为空字符串时,返回值为0,如果有字母就只返回之前的数字,作用是字符串转整数

认识环境变量

首先,要说明,每当启动系统时,环境变量就已被系统开辟完毕。

环境变量不是只有一个,而是一堆,是系统内具有特殊用途的变量。如:PATH、PWD、USER、HOME等。

环境变量的作用

系统通过环境变量来认识用户

        环境变量可以很好的帮助系统、用户、应用程序和脚本进行配置和运行。系统下的环境变量非常多,这里我们先认识下PATH、PWD、USER、HOME的功能。

PATH:它告诉shell或bash进程在哪里查找可执行文件。当你在命令行中输入一个命令时,shell会在PATH变量指定的目录中查找该命令的可执行文件。

PWD:存放这当前目录的绝对路径,对应的指令功能是pwd。

USER:它表示当前shell或bash登录的用户。当用户登录系统时,系统会设置USER环境变量为该用户的用户名。这个环境变量在系统运行时始终运转,即使我们在中间切换用户,USER环境变量的值仍然会保持为原来的用户名。

HOME:它表示当前用户的家目录的路径。当用户登录系统时,系统会设置HOME环境变量为该用户的家目录路径。跟USER一样,这个环境变量在系统运行时始终运转。

重点说明下PATH环境变量。

当我们使用指令时,系统都会展开 PATH 对应下的路径进行搜索相关指令,所以无论在什么路径下,系统相关的指令都可以使用。没有在此路径下的指令需根据具体路径来执行。

如果想自己的程序可以被直接执行,有以下的方法

1、拷贝自己的程序名字放到环境变量的默认路径里面,比如/usr/bin/,但是不太好,会污染命令池

2、把自己的路径放到环境变量里面,PATH=(自己的环境变量):$PATH不加:$PATH则会覆盖,如果不小心覆盖了 就重启恢复环境变量

环境变量命令行操作 

env:使用env指令进行查看系统下的所有环境变量以及环境变量对应的数据。

echo ¥环境变量名:查看单个环境变量的数据

export:export 是一个内置命令,export命令用于创建环境变量,定义一个变量并使用 export 命令后,它将变成一个当前bash的一个环境变量,适用于当前 shell 会话中运行的所有程序。它仅对当前会话有效,关闭终端或重启系统后会消失。

Set查本地变量和环境变量

unset 变量名: 清除环境变量

补充:

         环境变量具有全局属性,环境变量会被所有的子进程继承,包括孙子进程,我们借助bash运行程序时,所有程序的进程都是bash进程的子进程,所有说环境变量是被继承的。前面说过,程序的进程会获得父进程的环境变量,也就是可以获得bash进程的环境变量,你可以用通过main的第三个参数来获取,如下面代码

#include <iostream>
using namespace std;
int main(int n, char *S1[], char *S2[])
{
    for (int i = 0; S2[i]; i++)
    {
        cout << "S2[" << i << "]:  " << S2[i] << endl;
    }
    return 0;
}

本地变量只在内部有效,不会被子进程继承,不是环境变量。

代码获取环境变量的用法

environ和getenv函数

getenv:

这个常用,getenv(“usr“)…:可以获取到所有用户名

 下面使用getenv获取表中的指定名称的环境变量

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
int main()
{
    char*s = getenv("PATH");   //访问PATH环境变量
    cout << s << endl;
    return 0;
}

**environ:获取环境变量

                  在Linux中,environ是一个全局的外部变量,其类型为char**,存储着系统的环境变量。除了使用主函数中的第三个参数外,我们也可使用environ函数直接访问系统的环境变量。

注意:这里在代码内部使用environ时,需要先定义environ。在系统下的libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。定义如下

extern char **environ;

·

补充:

环境变量表

        环境变量表简称环境表,它是一个存储环境变量的数据结构,类似于一个数组,其中每个元素都是一个环境变量,而environ指针指向的就是存放环境变量的数据结构,而getevn指向表中指定名称的环境变量。

每个程序都会有一张环境表,环境表是一个字符指针数组

环境变量的存放

        Linux系统下的环境变量天然都会被保存在磁盘的文件中。只有登入系统时,bash/shell进程才会存在,也就是说只有登入系统的时候,才会分配bash/shell程序,而环境变量就在bash/shell的上下文中。当开始登入系统时,所有的环境变量都是从磁盘中的某些脚本或配置文件中来的。因此,每当重启系统时,环境变量都会被更新。

        通常,我们可以使用 set 指令显示本地定义的shell变量和环境变量,但要注意的是,本地定义的shell变量不能被子进程进行下去,它只在本地bash内部有效。

        在Linux系统中,.bash_profile是一个Shell脚本文件,它被用于在用户登录时设置用户的环境变量和配置选项。它是bash或shell的配置文件之一,通常位于用户的家目(~/.bash_profile)

        当用户登录时,bash_profile文件会被自动执行,允许用户设置环境变量等。通过编辑bash_profile文件,用户可以定制自己的shell会话环境,以便更方便地使用命令行工具和应用程序。每个用户都有自己的这个自动执行文件

代码演示:

首先,我们要进行配置环境变量

利用source执行配置文件,或者重启终端。

因为当系统启动时,环境变量就已执行,因此,配置完毕之后要重启用户才可被运行

因为当系统启动时,环境变量就已执行,因此,配置完毕之后要重启用户系统才可被运行

.bash_profile(可以加环境路径,重启后还有)

就是在启动后自动执行操作添加和删除环境变量,配置bash的环境变量由于继承相当于配置所有bash运行程序的环境变量

上一篇:嵌入式AI之rknn yolov5初探


下一篇:2024年9月中国电子学会青少年软件编程(Python)等级考试试卷(六级)答案 + 解析