【Linux系统编程】一文带你理解命令行参数和环境变量

【Linux系统编程】一文带你理解命令行参数和环境变量

前言

在 Linux 中,命令行参数环境变量是程序运行时最重要的两类信息。命令行参数是在运行程序时的内容,比如ls -l /etc 中的-l/etc,它们告诉程序需要完成什么操作;而环境变量是一组系统配置,如 PATHHOME 等,用来影响程序的运行环境。当我们在 bash 中执行命令时,bash 会先准备好一份命令行参数表,再把当前会话的环境变量表一并传递给程序。理解它们的作用,可以帮助我们更好地使用 Linux 命令和配置系统环境。


一、命令行参数

1、是什么

  • 我们在Linux的bash窗口输入的每一行命令就是命令行参数
  • 例如ls -a这个命令bash会将它加载到一个指针数组中,这个数组就是命令行参数表,加载到命令行参数表中就是这个格式:["ls","-a"]

2、验证

  1. 通过C语言中的main()函数验证“是什么”的概述
  2. main函数原型:int main(int argc,char* argv[],char* env[])
    • int argc参数:命令行参数个数
    • char* argv[]参数:命令行参数列表,(数组中的每个元素是字符串,所以是指针数组)
    • char* env[]参数:环境变量列表 (等会儿环境变量会讲到)
  3. 重点:在底层实现中argv的的最后一个参数为NULL(argv[argc]==NULL)

打印输出命令行参数列表:

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

运行结果:

  • argv[0] = "./code"
  • argv[1] = "1"
  • argv[2] = "2"
  • argv[3] = "3"

二、环境变量

1. 是什么

  • 环境变量(environment variables)⼀般是指在操作系统中⽤来指定操作系统运行环境的⼀些参数
  • 每登录一个用户,Linux系统都会为其单独创建一个bash进程,创建bash进程时也会创建环境变量命令行参数表
  • 环境变量在系统当中通常具有全局特性
  • 是一个指针数组,最后一个参数是NULL

在内存中组织方式

env  ──┬─> "PATH=/usr/local/sbin:/usr/local/bin:"
       ├─> "HOME=/home/xxx"
       ├─> "USER=xxx"
       ├─> "HISTSIZE=1000"
       └─> NULL  ← 终止

每个元素指向一段以\0结尾的 C 字符串。

2.怎么用

2.1 环境变量常用命令

  • echo: 显⽰某个环境变量值
  • export: 设置⼀个新的环境变量
  • unset:删除环境变量
  • env: 显⽰所有环境变量
  • unset: 清除环境变量
  • set: 查看本地定义的shell变量和环境变量

2.2 添加环境变量

  • 前面编译的code文件,为什么只能使用./code在当前目录下执行,而像ls文件就可以全局页面执行;
  • 为什么ls可以这样使用,因为ls编译的二进制文件存放的位置在环境变量PATH中以及声明过;系统会拿lsPATH中的目录拼接,如果找到对应的二进制文件就执行,没找到就报错
  • 如何使我们编写的code文件也在全局页面执行呢,两种方法:
方法一:将code文件放到PATH中存在的目录中
  • 多个目录会用:分隔
xxx@aliyun:/learnlinux/linux/leason12$ sudo cp code /usr/local/sbin/
方法二:将code文件目录添加到PATH中
xxx@aliyun:/learnlinux/linux/leason12$ PATH=$PATH:/learnlinux/linux/leason12

⚠️注意

  • 环境变量中都是以键值对的方式存储,PATH是键,$PATH是取它的值;
  • 不要直接将要添加的目录赋值给PATH,这样会覆盖原本的内容,$PATH取值,然后使用:拼接要添加的目录
  • 当你重新打开bash或者打开一个新的bashPATH中的值会重置(每次一个新的bash都会加载bash_profile文件中的内容,在PATH中添加的目录在文件中并没有记录,就不会加载)
方法三:export

命令行输入的方式添加环境变量,格式:export [变量名]=[变量参数]

2.3 获取环境变量

方法一:main函数的env参数

也就是main的第三个参数char* env[],以数组形式存储所有环境变量

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

运行结果:与env命令查看的结果相同

方法二:getenv()
  • 函数原型:char *getenv(const char *name);,头文件:<stdlib.h>
  • const char *name参数:环境变量的
  • 根据环境变量名称获取环境变量内容(成功返回参数首地址char*,失败返回NULL

代码示例:仅指定目录下可运行

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[],char* env[])
{ 
    char* flag=getenv("PWD");
    char* pwd="/learlinux/linux/leason12";

    if(strcmp(pwd,flag)==0)
        printf("当前目录是:%s\n",flag);
    else
        printf("仅leason12目录可执行\n");
	return 0;
}

/learnlinux/linux/leason12目录下执行:

在其他目录下执行:

方法三:使用extern char **environ变量

environ是一个系统的全局变量,指向环境变量列表的首地址

代码示例:指针访问

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern char** environ;
int main(int argc,char *argv[],char* env[])
{ 
    char** i=environ;
    while(*i){	//环境变量列表最后一个参数为NULL
        printf("environ==>%s\n",*i++);
    }
	return 0;
}

三、总结

  1. 命令行参数一次性的信息,由用户在运行时指定。
  2. 环境变量可继承的信息,由父进程传递给子进程。
  3. 程序可以同时利用两者:
    • 命令行参数 → 更高优先级,适合临时配置。
    • 环境变量 → 默认配置,全局影响。

以上就是本期全部内容,如果本文对你有点帮助,希望给个三连!下期再见~
(文中哪里的讲解有问题,希望大家能够指出,非常感谢!)

转载请说明出处内容投诉
CSS教程网 » 【Linux系统编程】一文带你理解命令行参数和环境变量

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买