【linux】环境变量(详解)

目录

一、命令行参数

[1. 什么是命令行参数?](#1. 什么是命令行参数?)

[2. main函数有参数吗?](#2. main函数有参数吗?)

二、环境变量

[1. 什么是环境变量?](#1. 什么是环境变量?)

[2. 环境变量的分类](#2. 环境变量的分类)

[3. 环境变量------PATH](#3. 环境变量——PATH)

补充:环境变量是怎么来的?

[4. 怎么查看环境变量](#4. 怎么查看环境变量)

[4.1、查看指定环境变量------echo NAME](#4.1、查看指定环境变量——echo NAME)

4.2、env------显示所有环境变量

4.3、set------显示shell变量和环境变量

4.4、通过main函数第三个参数------env

4.5、通过第三方变量environ获取

补充:环境变量如何被组织?

4.6、通过系统调用获取或设置环境变量

5、认识更多环境变量

6、添加和删除环境变量

[1. 添加环境变量](#1. 添加环境变量)

[2. 删除环境变量](#2. 删除环境变量)

[7. 环境变量的继承性和全局属性](#7. 环境变量的继承性和全局属性)

补充:内建命令和常规命令


一、命令行参数

1. 什么是命令行参数?

当我们登录Linux,输入的指令后跟着的相关的选项就是命令行参数。

2. main函数有参数吗?

我们平时可能都没有注意到,其实main函数也有自己的参数。

复制代码
int main(int argc, char *argv[], char *env[]);

argc:代表参数的个数;

argv:字符指针数组,命令行被分开存储在数组中;

env:字符指针数字,存储环境变量。

下面我们通过一段代码来验证一下:

复制代码
#include<stdio.h>

int main(int argc, char *argv[])
{
    for(int i = 0; i < argc; i++)
    {
        printf("%s ", argv[i]);
    }
    printf("\n");
    return 0;
 }  

./test 运行上面的代码,其实就是一句指令,main在其参数中其实记录了我们输入的指令和选项。

💡那这有什么用呢?

当我们带上选项去执行 test 程序时,就可以通过选项完成指定的任务:

bash 复制代码
#include <stdio.h>
#include<string.h>
int main(int argc, char *argv[])
{
    for(int i = 0; i < argc; i++)
    {
        if(strcmp(argv[i],"-a") == 0)
            printf("任务1已完成\n");
        if(strcmp(argv[i],"-b") == 0)
            printf("任务2已完成\n");
        if(strcmp(argv[i], "-c") == 0)                                                                                                                                          
            printf("任务3已完成\n");
    }
    return 0;
 }

二、环境变量

1. 什么是环境变量?

环境变量一般指的是在操作系统中用于指定操作系统运行环境的一些参数。

我们写的C/C++代码在链接动态库时,我们并不知道库在哪里,但是我们却可以链接成功,就是因为有环境变量帮编译器查找。

2. 环境变量的分类

Linux系统中的环境变量根据生命周期分为:

(1)永久的:根据系统的配置文件生成的,永久生效。

(2)临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效。

根据作用域分为:

(1)系统环境变量:对该系统中所有用户都有效。

(2)用户环境变量:只对特定的用户起作用。

3. 环境变量------PATH

当我们要执行一个程序或者一个指令,就要去找对应的二进制文件。

💦 怎么找?

环境变量------PATH帮助Shell(命令解释器,如 bash)去找二进制文件。

比如当我们执行:ls -a -l指令,Shell 本身不知道 ls 存放在哪个目录,会按顺序遍历 PATH 环境变量中所有以冒号分隔的目录去找对应的文件**。**

💦 怎么查看PATH这个环境变量?

bash 复制代码
echo $PATH

🌈一个有趣的现象:

当我们执行系统指令的时候,如ls,pwd时,只需要输入指令即可;当我们要执行我们自己的程序,如 test,就需要带上 ./test(. 代表当前工作路径,/ 路径分隔符)。

💦 这是为什么?

因为对应系统命令,可以通过PATH环境变量来帮助 shell 找到 ls 和 pwd 对应的文件(即shell遍历环境变量),而在echo $PATH打印出的路径没有我们可执行程序的文件,所以shell找不到,就需要我们带上我们程序的路径。

💡有没有办法让我们直接通过 test,就可以执行我们的执行?

其实 test 也是指令,所以我们如果将test 对应文件的路径添加到PATH 默认的路径后面,不就可以直接执行了。

添加路径到PATH中有两种方式:

(1)PATH=相关路径:就会覆盖系统默认的PATH的内容。

(2)PATH=$PATH:相关路径,这种方式相当于把你要添加的路径拼接到了PATH原来的路径后面。

++注意:++以上两种方式其实并不会改变PATH默认的内容,当我们退出再次登陆后,PATH又会恢复到原来的样子。

补充:环境变量是怎么来的?

在家目录中有两个配置文件:.bash_profile 和 .bashrc,当bash进程启动(登录 Shell 加载 .bash_profile,交互式非登录 Shell 加载 .bashrc),就会根据配置文件生成环境变量表。

4. 怎么查看环境变量

4.1、查看指定环境变量------echo $NAME

NAME即环境变量名,上面已经演示过了。

4.2、env------显示所有环境变量
bash 复制代码
env
4.3、set------显示shell变量和环境变量
bash 复制代码
set
4.4、通过main函数第三个参数------env

上面我们在介绍命令行参数时,提到main函数其实有三个参数,而第三个就是环境变量数组。

下面我们就来实际验证一下:

bash 复制代码
#include <stdio.h>
int main(int argc, char *argv[], char *env[])
{                                                     
    for(int i = 0; env[i]; i++)    
    {                
        printf("%s\n", env[i]);                                                                                                                                                             
    }                
    return 0;
}  
4.5、通过第三方变量environ获取

是 Linux系统中 C 语言的全局变量,用于直接访问进程的所有环境变量。

变量类型:

bash 复制代码
extern char **environ;
bash 复制代码
#include<stdio.h>
int main()                                                
{                                     
    extern char **environ;                            
    for(int i = 0; environ[i]; i++)           
        printf("%s\n", environ[i]);                                                                                 
    return 0;         
} 
补充:环境变量如何被组织?
4.6、通过系统调用获取或设置环境变量

• putenv , 后面讲解

• getenv , 本次讲解

bash 复制代码
#include<stdlib.h>                                                 
int main()                                                       
{                                                         
    char *r1 = getenv("PATH");        
    char *r2 = getenv("USER");                        
    printf("%s\n", r1);                       
    printf("%s\n", r2);                                                                                                                                                                       
    return 0;         
}

5、认识更多环境变量

bash 复制代码
# 1. 添加普通环境变量(如 MY_VAR=值)
export MY_VAR="hello"

# 2. 添加路径到 PATH(比如把你的 test 目录加入 PATH)
export PATH=$PATH:/home/hds/code/lesson13
  1. HOSTNAME:指主机的名称。

  2. SHELL:bash所在的路径。

  3. HISTSIZE:记录历史命令的条数,这就是为什么我们能够查找历史命令的原因。

  4. USER:创建bash 的用户。

  5. PWD:当前的工作路径。

  6. OLDPWD:最近切换的一次路径。

  7. MAIL:当前用户的邮件存放目录。

  8. HOME:代表家目录。

6、添加和删除环境变量

1. 添加环境变量

1.1、临时添加(仅当前终端生效,重启 / 新开终端失效)

所有 Shell 通用,直接在终端执行 export 命令即可:

bash 复制代码
# 1. 添加普通环境变量(如 MY_VAR=值)
export MY_VAR="hello"

# 2. 添加路径到 PATH(比如把你的 test 目录加入 PATH)
export PATH=$PATH:/home/hds/code/lesson13

1.2、永久添加(重启终端仍生效)

需编辑对应 Shell 的配置文件:当前用户(bash Shell,绝大多数 Linux 默认)

bash 复制代码
// 步骤一:打开配置文件
# 编辑 ~/.bashrc(交互式终端默认加载,最常用)
vim ~/.bashrc

// 步骤二:
# 示例1:添加普通环境变量
export MY_VAR="hello"

# 示例2:添加你的 test 目录到 PATH
export PATH=$PATH:/home/hds/code/lesson13

// 步骤三:让配置生效
source ~/.bashrc
2. 删除环境变量
bash 复制代码
// NAME 代表环境变量名
unset NAME

对于 PATH 环境变量,++注意:如果unset PATH,就会将所有内容删除。++

bash 复制代码
# 步骤1:查看当前 PATH(复制输出内容,备用)
echo $PATH
# 输出示例:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin:/home/hds/code/lesson13

# 步骤2:重新赋值 PATH,去掉目标目录(仅保留其他部分)
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/bin

# 步骤3:验证:PATH 中已无 /home/hds/code/lesson13
echo $PATH

7. 环境变量的继承性和全局属性

环境变量通常具有全局属性,可以被子进程继承下去。

继承:子进程会复制父进程的环境变量表作为自己的初始环境变量,这是环境变量传递的唯一方式。

在bash进程创建环境变量:export MY_ENV="hello Linux"

bash 复制代码
#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>                                                                                                                                                           
int main()
{
    printf("%s\n", getenv("MY_ENV"));
    pid_t id = fork();
    if(id == 0)
    {
        // 子进程
        printf("我是子进程:%s\n", getenv("MY_ENV"));
    }
    return 0;
}

(1)子进程对环境变量的修改不影响父进程(写时拷贝)。

(2)本地变量无法被子进程继承:

补充:内建命令和常规命令
  1. 常规命令

常规命令的执行,是通过创建子进程来完成的------ 这些命令是独立的程序,Bash 会启动一个新的子进程,让子进程去运行这个程序,程序跑完子进程就结束。

  1. 内建命令

内建命令的执行,Bash 不会创建子进程,而是由 Bash 自己直接执行 ------ 相当于 Bash 调用了自己内置的功能(类似 Bash 自己写好的函数),不用额外开新进程。

内建命令:

• 执行效率更高

无需创建子进程,直接由 Shell 执行,比如 cd/export 这类高频命令,内建实现能大幅提升效率。

• 能修改 Shell 自身的环境

外部命令运行在子进程中,修改的环境变量无法影响父 Shell;但内建命令直接在 Shell 进程中执行,可修改 Shell 的环境。

😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😘

相关推荐
落羽的落羽8 小时前
【C++】并查集的原理与使用
linux·服务器·c++·人工智能·深度学习·随机森林·机器学习
神奇的程序员15 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
虾..16 小时前
Linux 软硬链接和动静态库
linux·运维·服务器
Evan芙16 小时前
Linux常见的日志服务管理的常见日志服务
linux·运维·服务器
玄斎17 小时前
MySQL 单表操作通关指南:建库 / 建表 / 插入 / 增删改查
运维·服务器·数据库·学习·程序人生·mysql·oracle
rit843249918 小时前
C# Socket 聊天室(含文件传输)
服务器·开发语言·c#
trayvontang18 小时前
Nginx之location配置
运维·nginx
十六年开源服务商18 小时前
WordPress定制开发最佳公司的用户画像
运维
hkhkhkhkh12318 小时前
Linux设备节点基础知识
linux·服务器·驱动开发