【Linux系统】命令行参数与环境变量
文章目录
一、命令行参数
在正式讲解这个概念之前,我们首先得知道以下这个问题:
问题1️⃣:C/C++中的main函数有参数吗🧐??
- 答案当然是有的!!

- 图中红框圈起来的就是命令行参数,也就是main函数的参数。
- 其中
argc表示参数个数,argv为参数列表。
我们在命令行中输入的指令本质上是一个字符串,shell外壳以空格为分隔符,将拆分后的字串存入argv中,子串的个数即为argc。而以上这些工作都交由给bash(Linux系统的命令行解释器)完成。
我们可以执行以下代码来验证这个说法:
#include<stdio.h>
/*
*命令行中输入的指令:./code a b c d e
*/
int main(int argc, char *argv[])
{
int i = 0;
for(;i < argc; i++)
{
printf("argv[%d]->%s\n", i, argv[i]);
}
return 0;
}

其中我们要注意以下两个细节:
- 参数个数至少为1,也就是
argc >= 1,并且argv[0]一定会有元素,且指向的为程序名!! argv的大小为argc,argv[argc-1]是做后一个参数,而argv[argc] == NULL这是可检验的
那么这个命令行参数究竟有什么作用呢?
可能有人会发现,这种格式有点像我们平时写的指令,的确!!🌟🌟命令行参数的本质应用是为了实现一个指令,并且可以根据不同的选项实现不同的子功能!!也就是Linux中所有命令选项功能的实现方式
问题1️⃣:windous操作系统下的VS2022中有命令行参数吗🧐??
- 有!!命令行参数是C语言的特点,任何操作系统下都有。
问题2️⃣:命令“cat file.txt”是如何打印出文件内容的🧐??
- 通过命令行参数获取文件名,再使用文件相关的函数便可以在终端上打印出文件内容。
二、环境变量
2.0、引入问题

问题1️⃣:我们自己写的程序为什么不能够像指令一样,不带“./”就可以执行🧐??
- 命令实际就是某个特定路径下的普通文件。比如
ls命令就是在/uer/bin路径下:
- 默认情况下,
Linux不会再在当前路径下寻找文件,而是在/usr/bin路径下。而./指的就是相对路径,本质上是在告诉操作系统“用户要执行的文件就是在当前路径下”。 - 那么,如果我们将
code文件放在/usr/bin路径下,是不是就可以达到我们的预期了??答案是肯定的,但是不建议这么做,会污染系统自带的文件。
2.1、🌟🌟PATH环境变量
通过前面的内容,有人可能会产生以下的疑惑:
问题1️⃣:Linux操作系统怎么知道"/uer/bin"这个默认路径的,会不会去其他路径下寻找可执行文件呢🧐??
- 要回答这个问题就必须牵扯出环境变量的概念了。
Linux操作系统会存在所谓的环境变量。我们可以通过echo $[环境变量]指令查看环境变量中的内容。
我们认识第一个也是相对来说最重要的环境变量:PATH。
📖PATH:指定命令的默认搜索所路径。

我们可以看到,PATH环境变量下记录着以冒号为分隔符的各种路径。
🌟🌟在我们执行可执行程序的时候,PATH会告诉操作系统,如果用户没有指明文件路径,就默认在PATH下的路径从左向右依次查找;如果指明了路径,则在指明路径下查找。
综上,我们可以正式回答问题1️⃣了:Linux操作系统通过PATH环境变量找到/usr/bin这个路径的,再找到找到可执行文件之前,操作系统是有可能在其他默认路径下查找文件。
问题2️⃣:如果不带“./”,如何执行我们所写的程序🧐??
- 一个就是我们先前所说的,将我们的可执行文件放在PATH下的任意一个路径下。当然不推荐这种做法,这样会污染系统自带的文件
- 其二就是将我们的可执行文件所处的当前路径存放在PATH中。

我们一定要注意指令的格式,不能写成以下形式:
这样直接覆盖PATH路径下原本的路径。不过不用担心,直接重新登陆Xshell,操作系统会自动刷新,变为原本的PATH。
2.2、常见的环境变量
📖指令:env,查看系统环境变量。
- 环境变量有很多,并不止下图所展示的这些。

相对来说,需要被掌握的就是一下这些:
| 环境变量 | 作用 |
|---|---|
| PATH | 指定命令的搜索路径 |
| HOME | 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录) |
| LOGNAME | 当前登陆用户名 |
| PWD | 当前所处路径 |
| OLDPWD | 记录上一个所处路径(cd -就是利用该环境变量回到最近一次所处路径的) |
| SHELL | 当前Shell,它的值通常是/bin/bash |
| SSH_TTY | 终端文件所处路径(每一个用户在不同的终端登录,都会有一个终端文件) |
2.3、环境变量与C/C++代码、进程的关系
2.3.1、获取环境变量的三种方式
方式1️⃣:利用命令行参数env
前文中,我们已经了解了main函数的两个参数argc、argv,实际上,main函数最多有三个参数,第三个参数则为环境变量表char* env[]。

如果无人传递第三个参数,我们将如何获取环境变量呢??
环境变量具有全局属性!!因此,我们可以通过 第三方变量environ 或者系统调用getenv。
方式2️⃣:利用第三方变量environ

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
方式3️⃣:利用系统调用getenv
在实践中,系统调用getenv是最常用的获取环境变量的方式。
我们通过传入环境变量名,从而获取对应的数据。如果输入的环境变量名存在,则返回对应数据;如果不存在,则返回NULL。
通过这个例子,我们可以发现:可以通过特定的环境变量,控制程序在特定的情况下运行。
上图中,如果你不是用户“wyh”,你就不能够运行对应的代码。
2.3.2、🌟🌟细谈环境变量的全局性
了解了获取环境变量的三种方法,我们不免会有这样一种疑问:
问题1️⃣:环境变量为什么具有全局属性, 环境变量是谁传递的🧐??
- 首先输出结论:
argv和env两张表默认是在bash内部的!! - 而bash是一个进程,进程又是存储于内存中的!!所以可以推断出:argv和env是内存中的临时的表,是内存级数据!!
- 我的程序和命令等都是bash的子进程,子进程与父进程的代码与数据是可共享的。因此
argv和env两张表会不断共享给新的子进程。 - 结论:环境变量是父进程给的。或者说,环境变量是bash给的。因此,环境变量具有全局性。

问题2️⃣:bash中的环境变量又是哪里来的呢🧐??
- 从Linux操作系统的配置文件得来的!!
- 正是有了配置文件的存在,我们重启xshell的时候,环境变量会经由配置文件初始化,进而恢复。因此,在上文中我们通过指令
PATH=$PATH:[相关路径]修改PATH环境变量时,只是临时修改了bash进程在内存当中的环境变量,不会修改配置文件。其他环境变量同理 - 在Linux系统的家目录下有这样两个文件
.profile和.bashrc,这就是相关的配置文件,在启动时,bash会自动执行这两个脚本,进而获取环境变量。我们自己也可以简单更改其中一个文件,来验证:
2.4、本地变量
除了系统自带的环境变量,我们用户还可以自己创建环境变量:
问题1️⃣:如何创建自己的环境变量🧐??
- 我们可以使用指令
export [环境变量名]=[具体信息]来创建环境变量。 - 单纯在命令行上操作,定义出来的环境变量是临时的。我们应该在配置文件中添加相关命令,才能够一直保留我们添加的环境变量。
- 创建环境变量的本质是将本地变量放入环境变量列表env中。
问题2️⃣:那么,什么是本地变量呢🧐??
- 如果对于上述指令不加
expor,这样所创建出来的变量就叫做本地变量。如下图:
虽然可以用echo打印出来,但是env列表查不到。 - 本地变量无法被子进程继承,不具备全局性,只能够在bash内部访问。那么本地变量究竟有什么作用呢??它能够支持自身的
Shell语法,保存临时信息。可以类比成C语言中的临时变量
2.5、内置命令
我们来看以下两个现象:
现象1️⃣:本地变量不能继承给子进程,但是echo运行属于子进程。
现象2️⃣:PATH环境变量清空后,有些指令能够执行,有些指令不能够执行。
直接输出结论:命令之间也有差距!我们可以将目前所学的命令分为两种:一种是存在的二进制文件级别的命令,即普通命令;另一种是在shell外壳内部自己定义的,bash自己内部的一次函数调用,即内建命令,这种命令不依赖第三方路径,上图中所展示的echo和pwd就属于这种命令。
此处只简单带过,关于内建命令的详细内容可见后续文章。
完🍀🍀🍀
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)