Linux - 命令行参数与环境变量

文章目录

命令行参数

命令行参数(Command-Line Arguments)是程序运行时通过终端 / 命令行传递给程序的输入数据,用于在不修改代码的情况下动态调整程序行为。它是程序与用户交互的基础方式之一,广泛应用于脚本、工具和系统程序中(如 ls -l 中的 -l 就是命令行参数)。

基本概念

  • 在终端中输入程序名后,跟随的一系列字符串(用空格分隔)。
  • 向程序传递临时配置(如选项、路径、文件名等),让程序根据参数执行不同逻辑。
  • 示例:ls -l -a

核心组成部分:

  • argc(argument count):整数,表示传递给程序的参数个数,包括程序名本身。
  • argv(argument vector):字符指针数组,存储每个参数的字符串表示,argv0 通常是程序名,argv1 是第一个参数,以此类推。
  • 示例代码:
cpp 复制代码
int main(int argc, char* argv[])
{
    int i = 0;
    for(;i < argc; i++)
    {
        printf("argv[%d]:%s\n", i, argv[i]);
    }
    return 0;
}

环境变量

环境变量是一种存储系统配置、程序参数和用户偏好的动态键值对(Key-Value),用于在不同进程间传递信息,是系统和应用程序正常运行的核心机制。其本质是 "变量名 = 变量值" 的字符串,例如 PATH=/usr/bin:/bin 中,PATH 是变量名,/usr/bin:/bin 是变量值。

基本概念

  • 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运⾏环境的⼀些参数
  • 在编写C/C++代码的时候,在链接的时候,在不知道所链接的动态静态库在哪的情况下,照样可以链接成功,⽣成可执⾏程序,原因就是有相关环境变量帮助编译器进⾏查找。
  • 环境变量通常具有某些特殊⽤途,还有在系统当中通常具有全局特性

常见环境变量

  • PATH:指定可执行文件的搜索路径
  • HOME:当前用户的主目录路径
  • USER:当前登录的用户名
  • SHELL:当前用户的默认shell程序路径
  • PWD:当前工作目录路径

查看环境变量⽅法

  • echo $NAME //NAME:你的环境变量名称
  • env
  • printenv NAME:

测试PATH

  1. 创建myprocess.c文件
cpp 复制代码
#include <stdio.h>
int main()
{
    printf("Hello World!!!\n");
    return 0;
}
  1. 对⽐ ./myprocess 执⾏和之间 myprocess 执⾏
  2. 将我们的程序所在路径加⼊环境变量PATH当中, export PATH=$PATH:myprocess程序所在路径,并且对⽐ ./myprocess 执⾏和之间 myprocess 执⾏

测试HOME

  1. ⽤root和普通⽤⼾,分别执⾏ echo $HOME ,对⽐差异
  2. ⽤root和普通⽤⼾,分别执⾏ cd ~ 和 pwd ,对应 ~ 和 HOME 的关系

和环境变量相关的命令

  • echo: 显⽰某个环境变量值
  • env: 显⽰当前所有环境变量
  • export: 设置或修改环境变量

  • unset: 删除环境变量
  • set: 显⽰本地定义的shell变量和环境变量
    • env/printenv 的区别
      env/printenv 只能显示环境变量,set 显示所有变量(环境变量 + 普通变量)+ 函数,包括 shell 变量和环境变量。

环境变量的组织方式

每个程序都会收到⼀张环境表,环境表是⼀个字符指针数组,每个指针指向⼀个以'\0'结尾的环境字符串

通过代码如何获取环境变量

  • 命令行第三个参数

    cpp 复制代码
    #include <stdio.h>
      int main(int argc, char *argv[], char *env[])
      {
          int i = 0;
          for(; env[i]; i++)
          {
              printf("%s\n", env[i]);
          }
          return 0;
      }
    • argc:记录命令行参数的总数量(含程序名)
    • argv:字符指针数组,数组中的每个元素都是一个字符串,存储每个命令行参数
    • env:字符指针数组,数组中的每个元素都是一个字符串,存储每个环境变量
  • 通过第三⽅变量environ获取

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

    libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头⽂件中,所以在使⽤时 要⽤extern声明。

通过系统调⽤获取或设置环境变量

  • getenv: 获取环境变量值

    cpp 复制代码
    #include <stdio.h>
    #include <stdlib.h>
    int main()
    {
        char *path = getenv("PATH");
        if(path != NULL)
        {
            printf("PATH=%s\n", path);
        }
        return 0;
    }

环境变量通常是具有全局属性的

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

    cpp 复制代码
      #include <stdio.h>
      #include <stdlib.h>
      int main()
      {
          char *env = getenv("MYENV");
          if(env)
          {
              printf("%s\n", env);
          }
          return 0;
      }

直接查看,发现没有结果,说明该环境变量根本不存在

  • 导出环境变量:export MYENV="hello world"
    再次运⾏程序,发现有结果,说明:环境变量是可以被⼦进程继承下去的
    查看,发现没有结果,说明该环境变量根本不存在

    外链图片转存中...(img-37phxl73-1760272815308)

  • 导出环境变量:export MYENV="hello world"
    再次运⾏程序,发现有结果,说明:环境变量是可以被⼦进程继承下去的
相关推荐
硅基手札4 分钟前
【Linux 内核专栏 13】快IO层
linux·服务器·嵌入式硬件
嵌入式分享16 分钟前
嵌入式分享#63:RK3588 怎么选?全系列选型指南
linux
李日华大战鸡红22 分钟前
滑膜观测器(学习记录)
stm32·单片机·学习·matlab·机器人
Pointer Pursuit30 分钟前
Linux调试器 ——gdb/cgdb
linux·运维·服务器
chenlance43 分钟前
PADS灌铜、覆铜过程和技巧小汇总
linux·服务器·网络
HideF1 小时前
【无标题】
linux
传奇开心果编程1 小时前
【现代声明式UI学与练】第4课 列表渲染与 key——如何高效渲染列表、key 的作用、列表重排时的状态保持
学习·flutter·react native·ui·swiftui·android jetpack
高山有多高1 小时前
【Linux笔记】NAT与内网穿透
linux
传奇开心果编程1 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
迷途之人不知返1 小时前
自主实现一个简单的shell命令行
linux