【Linux】环境变量

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

🌈收录专栏🌈:Linux

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

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


一、环境变量的定义

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

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

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

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

二、命令行参数

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

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

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

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,如果不是,就打印使用说明。然后获取第二个参数(argv[1]),通过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用户权限)。修改完成后,所有用户在下次登录或者打开新的终端时,新的环境变量就会生效。

相关推荐
互联网资讯1 小时前
详解共享WiFi小程序怎么弄!
大数据·运维·网络·人工智能·小程序·生活
yanzhyan1 小时前
【Linux】Linux命令:free
linux·运维·服务器
web前端神器1 小时前
服务器机房迁移,centos系统root无法登录,也无法联网等问题
运维·服务器·centos
木偶☜2 小时前
Node.js接收文件分片数据并进行合并处理
服务器·javascript·arcgis·node.js
编程墨客2 小时前
IO进程----进程
linux·服务器·microsoft
可涵不会debug2 小时前
【C++】在线五子棋对战项目网页版
linux·服务器·网络·c++·git
清风-云烟2 小时前
使用redis-cli命令实现redis crud操作
java·linux·数据库·redis·spring·缓存·1024程序员节
Rm3 小时前
Linux 防火墙 Systemctl 常用命令速查
linux
稳联技术3 小时前
DeviceNet转Profinet网关+FANUC机器人:打造工业界的灭霸手套,掌控无限可能
运维·服务器