main 函数的参数与 Linux 环境变量(超详细精讲)

3 阅读3分钟

一、main 函数的标准参数

在 C 语言中,main 函数最完整、最标准的写法是:

c

运行

int main(int argc, char *argv[], char *envp[]);

一共 3 个参数

  1. argc:命令行参数的个数
  2. argv:命令行参数的字符串数组
  3. envp环境变量字符串数组(系统传给进程的环境变量)

二、argc & argv 到底是什么?

先看最基础的代码:

c

运行

#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;
}

核心结论

  • argc = 命令行参数的数量
  • argv = 字符串数组,存的是你在终端敲的每一段内容
  • argv[0] 固定是 程序名(路径)
  • argv[argc] = NULL(系统规定)

例子

你运行:

plaintext

./main hello world 123

输出:

plaintext

argc: 4
argv[0] -> ./main
argv[1] -> hello
argv[2] -> world
argv[3] -> 123

三、为什么命令行需要参数?

因为 Linux 所有命令都是靠 main 参数实现不同功能的!

比如:

plaintext

ls -l -a
cp file1 file2
rm -rf test

这些命令的 -l/-a/-rf 本质都是 argv[] 里的字符串。

命令行参数的作用:让一个程序根据不同选项执行不同逻辑。


四、argc & argv 三个必须记住的点

  1. argc 最小一定是 1,因为至少有程序名 argv[0]

  2. 参数之间以 空格分隔

  3. argv[argc] = NULL,所以循环可以写成:

    c

    运行

    for(i=0; argv[i]; i++)
    

环境变量(超级重点)

1. 为什么自己的程序必须 ./main 才能运行?

系统命令(ls、cp、pwd)都在 /usr/bin 目录下。系统会去 PATH 环境变量 包含的路径里找命令。

你自己的程序不在 PATH 里,所以必须加路径:

plaintext

./main

解决方案(两种)

  1. 把程序拷贝到 /usr/bin(不推荐,污染系统)

  2. 把当前路径追加到 PATH(推荐)

    bash

    运行

    export PATH=$PATH:.
    

之后就可以直接:

plaintext

main

2. 环境变量 PATH 是什么?

PATH 是一串用 冒号:分隔 的路径。

当你输入命令时,系统会依次去这些路径找可执行文件

查看 PATH:

bash

运行

echo $PATH

3. 环境变量从哪来?

  • 环境变量存储在 bash 进程

  • bash 启动时从配置文件读取:

    • ~/.bashrc
    • /etc/profile
  • 环境变量是内存级的,重启终端就会恢复默认


4. 环境变量的传递规则

环境变量由父进程传递给子进程!

  • bash 是父进程
  • 你的 ./main 是 bash 的子进程
  • 子进程默认继承父进程的环境变量
  • 所以环境变量具有全局性

在 C 程序中获取环境变量(3 种方法)

方法 1:main 第三个参数 envp []

c

运行

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

方法 2:全局变量 environ

c

运行

#include <stdio.h>
int main() {
    extern char** environ;
    int i=0;
    for(; environ[i]; i++) {
        printf("%s\n", environ[i]);
    }
    return 0;
}

方法 3:getenv () 最实用(推荐)

c

运行

#include<stdio.h>
#include<stdlib.h>
int main() {
    char* user = getenv("USER");
    printf("当前用户:%s\n", user);
    return 0;
}

常用环境变量:

  • USER:当前用户名
  • PATH:可执行文件搜索路径
  • HOME:家目录
  • PWD:当前路径
  • HISTSIZE:历史命令最大条数
  • SHELL:当前 shell

本地变量 vs 环境变量

本地变量

  • 只在当前 bash 有效
  • 不能被子进程继承
  • 不是环境变量

定义:

bash

运行

MYVAR=123

环境变量

  • 可以被子进程继承
  • 具有全局性

把本地变量导出成环境变量:

bash

运行

export MYVAR

删除环境变量:

bash

运行

unset MYVAR

最终总结(最核心)

  1. main(int argc, char *argv[]) 是 Linux 命令的实现基础
  2. argv[0] = 程序名,argc >= 1
  3. 环境变量来自父进程 bash,具有全局继承性
  4. 获取环境变量最常用:getenv()
  5. export 将本地变量变环境变量
  6. unset 删除环境变量
  7. PATH 决定了你能不能直接运行命令