一、命令行参数

在正式讲解这个概念之前,我们首先得知道以下这个问题:

问题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. 参数个数至少为1,也就是argc >= 1,并且argv[0]一定会有元素,且指向的为程序名!!
  2. argv的大小为argcargv[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️⃣:如果不带“./”,如何执行我们所写的程序🧐??

  1. 一个就是我们先前所说的,将我们的可执行文件放在PATH下的任意一个路径下。当然不推荐这种做法,这样会污染系统自带的文件
  2. 其二就是将我们的可执行文件所处的当前路径存放在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函数的两个参数argcargv,实际上,main函数最多有三个参数,第三个参数则为环境变量表char* env[]
在这里插入图片描述
在这里插入图片描述

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

方式2️⃣:利用第三方变量environ

在这里插入图片描述

libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
在这里插入图片描述

方式3️⃣:利用系统调用getenv

在实践中,系统调用getenv是最常用的获取环境变量的方式。
在这里插入图片描述
我们通过传入环境变量名,从而获取对应的数据。如果输入的环境变量名存在,则返回对应数据;如果不存在,则返回NULL。
在这里插入图片描述
通过这个例子,我们可以发现:可以通过特定的环境变量,控制程序在特定的情况下运行。
上图中,如果你不是用户“wyh”,你就不能够运行对应的代码。


2.3.2、🌟🌟细谈环境变量的全局性

了解了获取环境变量的三种方法,我们不免会有这样一种疑问:

问题1️⃣:环境变量为什么具有全局属性, 环境变量是谁传递的🧐??

  • 首先输出结论:argvenv两张表默认是在bash内部的!!
  • 而bash是一个进程,进程又是存储于内存中的!!所以可以推断出:argv和env是内存中的临时的表,是内存级数据!!
  • 我的程序和命令等都是bash的子进程,子进程与父进程的代码与数据是可共享的。因此argvenv两张表会不断共享给新的子进程。
  • 结论:环境变量是父进程给的。或者说,环境变量是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自己内部的一次函数调用,即内建命令,这种命令不依赖第三方路径,上图中所展示的echopwd就属于这种命令。

此处只简单带过,关于内建命令的详细内容可见后续文章。


完🍀🍀🍀

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐