首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【Linux系统】探索命令行参数与环境变量的本质

【Linux系统】探索命令行参数与环境变量的本质

作者头像
落羽的落羽
发布2025-12-18 19:49:03
发布2025-12-18 19:49:03
1440
举报

在这里插入图片描述
在这里插入图片描述

各位读者大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽

一、命令行参数

学了C语言和C++,来思考一个问题: main函数能不能带参数?

在这里插入图片描述
在这里插入图片描述

看起来可以,而且源文件编译后也能正常执行,那么main函数带参数有什么意义呢?

C/C++中,main函数的参数,称为命令行参数 C标准对带参main的规定是:

  • 第一个参数:类型为int(表示命令行参数个数),通常设为int argc
  • 第二个参数:类型为char* [](字符指针数组),通常设为char* argv[]

argv是一个字符串数组,它有argc个元素。 argv[0]元素是这个程序名,argv[argc]是NULL。数组的元素,是在命令行执行程序时读取的子串! 命令行参数,可以用来实现一个程序读取不同选项而实现不同的子功能!

证明一下:

代码语言:javascript
复制
#include<stdio.h>
int main(int argc, char* argv[])
{
    printf("argc:%d\n", argc);
    int i = 0;
    for(; i < argc; i++)
    {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
    return 0;
}
在这里插入图片描述
在这里插入图片描述

举个栗子,执行ls命令时,使用ls -a选项,能达到特殊的效果。此时在命令执行内部,argc是2(因为命令行有两个子串ls、-a),argc[0]是"ls",argc[1]是"-a"。程序内部就可以用strcmp等方法判断argc[1]内容,进而能执行不同子程序!

有了这个方法,我们也能在自己的程序中实现带选项的功能了,举例:

代码语言:javascript
复制
#include<stdio.h>
#include<string.h>
int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        //说明此时命令行中没有写选项
        printf("执行没有选项的功能\n");
    }
    else if(argc == 2)
    {
        if(strcmp(argv[1],"-a") == 0)
        {
            printf("执行选项-a功能\n");
        }
        else if(strcmp(argv[1], "-b") == 0)
        {
            printf("执行选项-b功能\n");
        }
        else if(strcmp(argv[1], "-c") == 0)
        {
            printf("执行选项-c功能\n");
        }
        else
        {
            printf("没有此选项\n");
        }
    }
    return 0;
}
在这里插入图片描述
在这里插入图片描述

没有问题

二、环境变量

环境变量,一般是指在操作系统中用于指定操作系统运行环境的一些参数。比如,我们在写C程序时,链接时自己并没有指定动静态库在哪里,但是就能自动链接成功,就是因为有相关的环境变量帮助编译器查找。 环境变量是系统级的变量,包括变量名和变量内容,往往有全局属性!

命令env,可以查看当前系统中所有的环境变量:

在这里插入图片描述
在这里插入图片描述

而命令echo $xxx,可以查看一个具体的环境变量的内容

1. 常见的几个环境变量

1.1 PATH

环境变量PATH:用于指定命令的搜索路径。

思考一下,既然命令本质也是可执行程序,比如ls,它的位置是/usr/bin/ls。为什么执行系统命令时可以不带路径直接输入ls,但是执行一个自己写的程序就必须带路径,如./test

这就是PATH的作用,当你输入一个命令而不指定目录时,系统会遍历 PATH 中配置的目录,查找与命令名匹配的可执行文件,找到后立即执行;若遍历完所有目录都没找到,就会报错!

回头来看,我们也可以指定系统命令的目录让系统查找:

在这里插入图片描述
在这里插入图片描述

通过echo $PATH命令,查看PATH中的内容:

在这里插入图片描述
在这里插入图片描述

原来,PATH中有很多目录,其中包括/usr/bin,这就是为什么直接执行ls,系统能通过遍历PATH中的目录,找到usr/bin,找到usr/bin/ls

所以,只要我们将自己写的程序所在路径写入到PATH中,就可以不用指定程序目录而能直接执行了。修改PATH的方法是:

  • PATH=路径(不能带空格):修改PATH的内容,会覆盖以前的内容(不必担心,重新登录系统会恢复)
  • PATH=$PATH:路径(不能带空格):向PATH中新增一个路径,不会覆盖以前的内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
1.2 HOME

环境变量HOME:用于指定当前用户的工作目录,即用户登录系统时所处的默认目录

在这里插入图片描述
在这里插入图片描述
1.3 SHELL

环境变量SHELL:是当前系统的shell,通常是/bin/bash

在这里插入图片描述
在这里插入图片描述
1.4 PWD与OLDPWD

环境变量PWD记录着当前所处目录,OLDPWD则记录最近一次所处的目录: 它们对应着命令pwdcd -的原理

在这里插入图片描述
在这里插入图片描述

2. 环境变量相关命令代码

和环境变量相关的命令:

  • echo $xxx:显示某个具体环境变量的内容
  • env:显示所有环境变量
  • export xxx:设置一个新的环境变量
  • unset xxx:清除一个环境变量
  • set:显示所有本地定义的shell变量和环境变量

其中,export、unset是内存级的,他们修改环境变量后重启系统就会恢复。实际上,在每次启动系统时,系统会在~/.bash_profile等文件中重新配置环境变量,只要这些文件中的内容不变,环境变量在每次启动程序配置后都是一样的。 换句话说,假如我修改了~/.bash_profile内容,在每次启动系统时应该也会受影响:

比如,我在这个文件中新加一条命令:

在这里插入图片描述
在这里插入图片描述

果然,启动系统时这一句也被执行了:

在这里插入图片描述
在这里插入图片描述

环境变量,其实都被组织到了一张环境变量表中,这是一个字符指针数组,每个元素指向一个环境变量名=内容的字符串。而我们在程序中也能获取到这张表,进而能获取到环境变量,有几个方法:

  • main函数可以有第三个参数char* env[],就是环境变量表
在这里插入图片描述
在这里插入图片描述

打印结果:

在这里插入图片描述
在这里插入图片描述
  • C库中有一个第三方变量environ,在头文件<unistd.h>中,他也记录了环境变量表,使用时在部分编译器中还需声明extern char** environ;
在这里插入图片描述
在这里插入图片描述

执行结果也是一样的:

在这里插入图片描述
在这里插入图片描述
  • 通过系统调用getenv能获取某个具体环境变量内容,他在头文件<stdlib.h>中,给他传参具体的一个环境变量名,他返回这个环境变量的内容字符串
在这里插入图片描述
在这里插入图片描述

结果没问题:

在这里插入图片描述
在这里插入图片描述

3. 环境变量具有全局属性

环境变量,通常具有全局属性!可以被子进程继承下去。 命令行参数、环境变量,也是数据,默认是在bash内部,内存中的。bash启动的子进程,也能看到父进程bash的代码和数据。而bash进程的环境变量,是从Linux系统的配置文件中获取的,如~/.bashrc文件。

刚才提到,export可以设置一个环境变量,如export XXX="abc"。如果只写XXX="abc",这种称之为本地变量,这种变量无法被子进程继承,不具有全局属性,只能在bash内访问。

本篇完,感谢阅读

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、命令行参数
  • 二、环境变量
    • 1. 常见的几个环境变量
      • 1.1 PATH
      • 1.2 HOME
      • 1.3 SHELL
      • 1.4 PWD与OLDPWD
    • 2. 环境变量相关命令代码
    • 3. 环境变量具有全局属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档