【Linux】环境变量

🔥个人主页🔥:孤寂大仙V

🌈收录专栏🌈:Linux

🌹往期回顾🌹:【Linux】进程优先级与进程切换

🔖流水不争,争的是滔滔不


一、环境变量的定义

在 Linux 系统中,环境变量是一种动态命名的值,它可以影响系统运行时进程的行为。这些变量包含了有关系统配置、用户偏好以及应用程序运行环境等信息。例如,PATH环境变量定义了系统在哪些目录中查找可执行文件。当你在终端中输入一个命令(如ls)时,系统会根据PATH环境变量所指定的目录顺序来查找ls这个可执行文件。

环境变量(environment variables)⼀般是指在操作系统中用来指定操作系统运行环境的⼀些参数

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。

二、命令行参数

命令行参数是在运行程序时,在程序名称后面添加的一些额外信息,程序可以读取这些信息来调整其行为或获取所需的输入。

在 C 语言中,命令行参数通过 main 函数的参数来接收

argc 是一个整数,代表命令行参数的数量,其中包含程序名称本身。
argv 是一个字符指针数组,其中 argv0 存储程序名称,argv1 存储第一个参数,以此类推。

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


如图和代码,可看出命令行参数运行时存储在指针数组中。


为更深刻理解和观察命令行参数是怎么用的,请看下面代码

bash 复制代码
#include <stdio.h>                                 
#include <string.h>        

// main有参数吗?
int main(int argc, char *argv[])
{
    if(argc!= 2)
    {
        printf("Usage: %s [-a|-b|-c]\n", argv[0]);
    }

    const char *arg = argv[1];

    if(strcmp(arg, "-a")==0)
        printf("这是功能1\n");
    else if(strcmp(arg, "-b")==0)
        printf("这是功能2\n");
    else if(strcmp(arg, "-c")==0)
        printf("这是功能3\n");
    else
        printf("Usage: %s [-a|-b|-c]\n", argv[0]);
        return 0;
}


代码首先检查参数数量是否为 2,如果不是,就打印使用说明。然后获取第二个参数(argv1),通过strcmp函数与"-a"、"-b"、"-c"进行比较,根据比较结果输出相应的功能信息,如果都不匹配,也打印使用说明。

命令行参数让一个程序可以通过选型实现不同的子功能。 Linux是c语言写的,我们在命令行输入的指令就是命令行参数实现的。命令行参数是指令实现的原理


那么这里有一个问题,上面不是聊了我们的./code和系统指令是一个意思,但是为什么我们自己写的就要加./呢?

其实系统指令是在Linux系统中的uers/bin目录下的,我们可以把自己写的命令行参数实现的可执行程序放入uers/bin目录下,这样也可以直接进行调用。但是不建议这么干。

那么问题又来了,系统怎么知道要执行命令的时候要去user/bin目录下查呢?

因为环境变量

三、常见环境变量

查看所有的环境变量 用env指令

PATH

PATH : 指定命令的搜索路径

查看环境变量

指令如下

bash 复制代码
echo $NAME //NAME是环境变量的名称 

如图,就是指定命令的路径。


要想把我们自己的路径中的可执行放入环境变量中,用到指令如下:

bash 复制代码
PATH=$PATH:可执行程序所在的路径

其实这里把自己的可执行程序的路径放在环境变量中,是内存级的重新启动就会自己没了。


从存储角度理解环境变量

bash会形成一张表,叫环境变量表如上图这样存储环境变量。bash还有一张命令行参数表。bash先拿到指令在环境变量中进行查找。

所以要执行一个程序,会先找到bash通过PATH环境变量来找指令。

USER和LOGNAME

查看当前用户是谁

HISTSIZE

查看历史命令,bash会把历史命令记录下来,记录最近的1000条

PWD

记录了当前的工作路径

取消环境变量

bash 复制代码
unset 要取消的环境变量

四、获取环境变量

通过代码获取环境变量


环境变量的特性

环境变量是可以被子进程继承下去的(也就是说环境变量是全局的)

其实我们所写的所有进程都是子进程,因为它们(不包括由我们所写的进程所创建的进程)的父进程都是bash

也就是说bash就是把它的环境变量通过main函数传参给了我们所写的进程


getenv函数:获取指定的环境变量

根据环境变量的名字获取环境变量的内容

bash 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc,char* argv[],char* env[])
{
    pid_t id=fork();
    if(id==0)
    {
        //子进程执行
        char* username=getenv("USER");
        printf("you are: %s\n",username);
    }
    return 0;
}

用于验证身份

如果当前用户不是我们设置的用户,即使是root用户来了也不行

environ获取环境变量

这里是一个二级指针,指向了char* env\[\]这个指针数组来查看对应的变量

五、本地变量

本地变量:作用域仅限于当前会话或进程及其子进程,不同用户的本地变量相互独立,不会影响其他用户或系统层面的环境配置。本地变量是不会被子进程继承的,只在bash内部有效的变量


创建本地变量

myname,赋值为用户

bash 复制代码
myname=hbx

验证本地变量的特性

本地变量不会被子进程继承。只在bash中

可以发现本地变量不会被子进程继承


移除本地变量

bash 复制代码
unset 本地变量名或者是环境变量名
bash 复制代码
unset myname

移除成功

六、定义环境变量的方法

临时定义(仅对当前会话有效)

使用export命令:

我们可以同过export命令,把子进程的东西给父进程。但是这时候就会出现疑惑,子进程不是继承父进程的东西吗。其实export是内建命令不需要创建子进程,而是让bash自己亲自执行,bash自己掉函数或者进行系统调用。

例如,要定义一个名为MY_VARIABLE的环境变量,并将其值设置为my_value,可以在终端中输入以下命令:

bash 复制代码
plaintext
export MY_VARIABLE = my_value

注意,在等号两边不能有空格,否则会出现错误。正确的写法也可以是export MY_VARIABLE=my_value。

现在,在这个终端会话中,任何可以访问环境变量的程序都能够获取MY_VARIABLE的值。例如,在一个脚本文件中可以通过$MY_VARIABLE来引用这个变量的值。

在命令行直接赋值(适用于简单变量):

可以直接使用VARNAME=value的形式来定义一个变量,但这种变量不是环境变量,只是一个普通的 shell 变量。如果要将其变成环境变量,可以使用export命令。例如:

bash 复制代码
plaintext
MY_VAR=test
export MY_VAR

永久定义(对所有会话有效)

通过修改配置文件(适用于特定用户)

对于 Bash shell 用户(大多数 Linux 默认的 shell):

可以编辑用户主目录下的.bashrc文件(这个文件在用户每次打开一个新的 Bash 终端时会被读取)。使用文本编辑器(如vi或nano)打开~/.bashrc文件,在文件末尾添加如下内容:

bash 复制代码
plaintext
export MY_PERMANENT_VARIABLE = my_permanent_value

保存文件后,在终端中运行source ~/.bashrc或者重新打开一个终端,新定义的环境变量就会生效。这个变量会在用户每次登录或者打开新的 Bash 终端时自动设置。

对于所有用户(系统级别的环境变量):

可以编辑/etc/profile文件。这是一个系统级别的配置文件,会对所有用户生效。在/etc/profile文件中添加环境变量定义的方式与在.bashrc文件中类似,例如:

bash 复制代码
plaintext
export SYSTEM_VARIABLE = system_value

注意,修改/etc/profile文件需要管理员权限(root用户权限)。修改完成后,所有用户在下次登录或者打开新的终端时,新的环境变量就会生效。

相关推荐
用户9718356334662 小时前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪3 小时前
linux 拷贝文件或目录到指定的位置
linux
大树8819 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠19 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质19 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush420 小时前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行52020 小时前
Linux 11 动态监控指令top
linux
小宇宙Zz20 小时前
Maven依赖冲突
java·服务器·maven
Inhand陈工21 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智21 小时前
ARP代理--工作原理
运维·网络·arp·arp代理