当前位置: 首页 > news >正文

Linux:命令行参数、环境变量

命令行参数

执行程序时,可以从命令行传值给 C 程序。这些值被称为命令行参数,它们对程序很重要,特别是当我们想从外部控制程序,而不是在代码内对这些值进行硬编码时,就显得尤为重要了。

在 C 语言中,命令行参数是一种从命令行获取输入的方法,可以用于运行程序时传递信息给程序。命令行参数通过 main 函数的参数传递给程序。main 函数的原型可以是如下两种形式之一:

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

或者:

int main(int argc, char **argv);

argc (argument count): 表示命令行参数的数量,包括程序名本身。因此,argc 至少为1

 argv (argument vector): 是一个指向字符串数组的指针,其中每个字符串是一个命令行参数。数组的第一个元素(即 argv[0])通常是程序的名称。接下来的元素是传递给程序的命令行参数。

环境变量

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,是操作系统为了满足不同的应用场景预先在系统内预先设置的一大批全局变量。

按生命周期分:
永久的:在环境变量脚本文件中配置,用户每次登录时会自动执行这些脚本,相当于永久生效
临时的:用户利用export命令,在当前终端下声明环境变量,关闭Shell终端失效
按作用域分:
系统环境变量:公共的,对全部的用户都生效。
用户环境变量:用户私有的、自定义的个性化设置,只对该用户生效。

 Linux 环境变量分类

系统级环境变量:
系统级环境变量对所有用户和进程都可见。它们通常在系统启动时被设置,并被所有用户和进程共享。一些常见的系统级环境变量包括PATH(用于指定可执行文件的搜索路径)、LANG(用于设置系统语言环境)等。

用户级环境变量:
用户级环境变量是每个用户独立设置的,只对该用户及其相关进程可见。这些变量可以在登录时通过不同的配置文件(如.bashrc、.bash_profile、.profile等)设置。常见的用户级环境变量包括HOME(指定用户的主目录路径)、USER(当前用户名)等。

进程级环境变量:
进程级环境变量是由特定进程设置的,并且仅对该进程及其子进程可见。这些变量可以通过编程语言(如C语言中的setenv函数)在程序中进行设置,或者通过终端命令行在特定的进程上下文中设置。

常⻅环境变量

PATH:决定了系统在哪些目录中查找可执行文件。当你输入一个命令时,系统会在PATH中定义的目录中查找该命令的可执行文件。

HOME:指定当前用户的主目录路径。

USER:当前用户的用户名。

SHELL:指定当前用户默认使用的shell。

LANG:指定系统的默认语言。

LD_LIBRARY_PATH:指定系统在哪些目录中查找共享库文件。

TERM:指定当前终端的类型。

PS1:定义命令行提示符的格式。

PS2:定义多行命令的提示符的格式。

查看环境变量⽅法

查看某一环境变量

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

查看所有的环境变量:

env

改变环境变量

设置新的环境变量,也可以用于修改已有的环境变量:

export NAME=//NAME为环境变量名

也可以在原有的环境变量上追加:

export PATH=$PATH:/home/nexus/process

进程是如何获取环境变量的

当我们打开终端界面时,会生成bash进程,bash进程有两个表:环境参数表和命令行参数表(都是类型为char*的指针数组),bash进程在启动时会读取操作系统本身的配置文件,并填写环境变量表,每当有子进程被创建时,父进程就将它的环境变量表传给子进程

当我们尝试通过指令或者程序操作等方法修改环境变量后,结束bash进程,并重新启动bash进程后会发现:环境变量会恢复为原先的配置。

这是因为每次启动bash进程都会读取系统的配置文件来获取环境变量,如果希望保持自定义的环境变量就需要修改配置文件,这样在每次bash启动后都会按照自定义配置文件进行初始化。

通过修改配置文件进行永久修改:

~/.bash_profile 和 ~/.bashrc:用户级环境变量配置文件。

/etc/profile 和 /etc/bashrc:全局环境变量配置文件。

修改配置文件后,需使用以下命令使其生效:

source ~/.bashrc

获取环境变量

使用命令行第三个参数

在C语言中,**<font style="color:rgb(6, 6, 7);">main</font>**函数可以接受三个参数,

通常定义为**<font style="color:rgb(6, 6, 7);">int main(int argc, char *argv[], char *env[])</font>**

*env[]实际就是环境表,是在操作系统调用main的时候传递给程序的,作为一个全局变量存储在main栈帧中。可以通过main函数的第三个参数env访问环境变量表:

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

使用全局变量environ

libc中定义了一个全局变量environ,它指向环境变量表:

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

需要注意的是,environ未包含在任何头文件中,因此需要手动声明。

使用库函数getenv

getenv函数可以获取指定的环境变量值:

#include <stdio.h>
#include <stdlib.h>
int main()
{printf("%s\n", getenv("PATH"));return 0;
}

相关文章:

  • [经验总结]Linux双机双网卡Keepalived高可用配置及验证细节
  • 大数据赋能,全面提升‘企业服务平台’实际效能!
  • 浏览器的存储机制 - Storage
  • NO.97十六届蓝桥杯备战|数论板块-最大公约数和最小公倍数|欧几里得算法|秦九韶算法|小红的gcd(C++)
  • 爬虫学习——Scrapy
  • Java编程语言 1.打印数组元素 2.Student类 StudentTest类
  • 【go】什么是Go语言中的GC,作用是什么?调优,sync.Pool优化,逃逸分析演示
  • alertManager部署安装、告警规则配置详解及告警消息推送
  • 华为openEuler操作系统全解析:起源、特性与生态对比
  • 机器学习模型(2/4课时):损失函数
  • 深度学习中的卷积神经网络
  • 命令行工具kubectl
  • 密码学中的盐值是什么?
  • RAII资源管理理解
  • Python 中的数据类型有哪些
  • 每日算法-250418
  • 智能化印刷新时代:Modbus 转profinet网关的完美融合,提升生产效率与环保标准
  • LangChain4j-第一篇 |几分钟完成deepseek 在线集成
  • 数据资产登记导则详解 | 企业如何规范化登记与管理数据资产?
  • ubuntu-24.04.2-live-server-arm64基于cloud-init实现分区自动扩容(LVM分区模式)
  • 上海市委常委会扩大会议传达学习习近平总书记考察上海重要讲话和在部分省区市“十五五”时期经济社会发展座谈会上的重要讲话精神
  • 新闻分析:电影关税能“让好莱坞再次伟大”?
  • 外交部:中欧关系50年发展最宝贵经验是相互尊重,求同存异
  • 央视热评:从银幕到生活,好故事如何“撬动”大市场
  • 侯麦:从莫扎特到贝多芬
  • 当Z世代与传统戏曲在春日校园相遇