【Linux】进程(5):命令行参数和环境变量

目录

[一 命令行参数和环境变量](#一 命令行参数和环境变量)

[1 命令行参数](#1 命令行参数)

[2 环境变量](#2 环境变量)

(1)概念+实际场景

(2)引入Linux环境变量

(3)获取,设置环境变量

(4)理解环境变量,修改配置文件实验

环境变量具有全局属性------本质:环境变量被子进程继承了!

和环境变量相关的命令


一 命令行参数和环境变量

1 命令行参数

main函数有参数吗?

有的

bash 复制代码
int main(int argc, char* argv[])

其中:char* argv是指针数组,有效元素是argc个

我们通过下面这个程序,来演示一下命令行参数:

同一个程序,根据选项的不同,呈现出不同的功能, 这种功能是通过命令行参数完成的

通过上面的两个参数我们发现:bash是以空格为分隔符,把每个字符填入到argv中,argv表以NULL结尾,让函数实现多选项功能

当我们在命令行输入不同的参数时,根据参数的不同,会执行不同的指令,如下:

解析命令行参数,通常是由bash来做

每个进程在启动的时候,都会有一张表:命令行参数表

Windows中也有类似的功能,例如:关机命令shutdown,也可以跟上不同的选项

2 环境变量

(1)概念+实际场景

变量:变量名+变量内容(和系统相关)

Windows怎么让可执行程序在命令行运行起来?

把程序的路径(不包括程序名),添加到系统的环境变量里(系统的环境变量可以在搜索框搜索出来)。命令行+程序回车,就能启动

下图演示了把网易云音乐加入到命令行启动的操作过程:


类似于这种,被系统用来做路径查找、记录操作和版本信息、记录工作路径等,这种系统级的变量,称为环境变量。

安装git,python这种软件的时候都会让配置环境变量

环境变量是系统级变量,保存系统启动和运行的核心参数,通常具有全局属性!

(2)引入Linux环境变量

我们先来引入一个环境变量:PATH

获取环境变量:echo $PATH

为什么用 C 语言写的程序myproc运行时要带路径./myproc,但pwd这类系统指令不用带路径?

系统开机时会维护环境变量PATH,这个变量里记录了该去哪条路劲查找指令。

pwd 等系统指令:它们的存放目录(如 /bin, /usr/bin)被预先配置在环境变量 PATH 中,系统能自动找到。
./myproc:你的程序所在的当前目录不在 PATH 中,所以必须用 ./ 明确告诉系统程序的位置,强制它直接执行当前目录下的文件

如果把当前路径添加到环境变量,运行时就不用加./,该怎么操作?

a 不正确的添加方法:PATH=[当前路径]

虽然这样会使myproc(自己写的程序)前面不用加./就能运行了,但是会导致其他指令没有办法运行,相当于直接覆盖了之前的路径

结论1:命令行中,修改环境变量,是内存级修改,重启 xshell 会恢复

b正确的添加方法:PATH=PATH:[当前路径]

which 命令通过 PATH 环境变量来查找可执行文件

which 是 Linux/Unix 系统中非常常用的命令,核心功能是在 PATH 环境变量指定的所有目录里,搜索指定命令的可执行文件路径,并返回第一个匹配到的结果。简单说,它能帮你快速定位 "某个命令到底存在于哪个文件夹"

常见环境变量:

- PATH:指定命令的搜索路径

- HOME:指定用户的主工作目录(即用户登陆到 Linux 系统中时,默认的目录

- SHELL:当前 Shell,它的值通常是 `/bin/bash`

查找环境变量:

bash 复制代码
echo $NAME //NAME:你的环境变量名称

环境变量各自独立

查所有的环境变量:env

getenv:获取环境变量的内容

在实际开发中,我们通常不需要遍历所有变量,而是想获取某个特定变量(比如 PATH)的值。这时使用标准库函数 getenv() 更方便。

指令的可执行程序,只能被"我"执行

我们来总结以上学到的内容:

(3)获取,设置环境变量

环境变量也有表,最后一个有效元素的下一个元素,必须是NULL

获取环境变量表的几种办法:
a. main函数其实仍然存在第三个参数,给main函数带第三个参数,就能获得环境变量表

标准的 main 函数有两种写法,第三种参数就是环境变量指针数组

bash 复制代码
// 写法一:使用第三个参数
int main(int argc, char *argv[], char *envp[]) { ... }

// 写法二:标准写法 (不写 envp)
int main(int argc, char *argv[]) { ... }

envp:全称 environment pointer,是一个字符串指针数组。
它的每一个元素 envp[0], envp[1]... 都是一个字符串,格式为 "变量名=变量值"(例如 "PATH=/usr/bin:/bin")。
数组的最后一个元素是 NULL,标志着环境变量列表的结束

运行结果:

你会看到和在终端里输入 env 命令几乎一样的输出,包含 PATH, HOME, PWD, USER 等所有环境变量。

b 通过第三方变量environ获取

在c语言中,存在一个char** environ,第三方全局变量,指向这张表,头文件<unistd.h>

c 通过getenv获取单个环境变量

上面两种方法都是简单粗暴的获得所有的环境变量,但是在实际开发中,我们通常不需要遍历所有变量,而是想获取某个特定变量(比如 PATH)的值。这时使用标准库函数 getenv() 更方便

getenv()函数返回一个指向环境中对应值的指针;如果没有找到匹配项,则返回NULL

(4)理解环境变量,修改配置文件实验

先引入一个结论:

结论:任何进程启动,都会存在两张表: 1. 命令行参数表 2. 环境变量表

这两张表都是由一个叫做bash的进程提供的,当我们登录的时候,bash提供命令行解析

环境变量具有全局属性------本质:环境变量被子进程继承了!

这一个一个环境变量值从哪里来的?从系统的配置文件

环境变量是内存级的?环境变量表是内存级的

本地变量:形如ok=1234,只在bash内部有效,不能继承

和环境变量相关的命令

环境变量是从系统的配置文件中来的

修改环境变量的本质:修改Linux中的配置文件

Linux系统内有两种命令,普通命令和内建命令

普通命令就是我们平时常见的命令

内建命令代表有:export env cd-

内建命令的特点:不会通过创建子进程执行,由bash提供且自己执行

bash其实也是一门脚本语言,是由c语言写的面向对象语言

bash内部1有很多的函数,调用自己内部的函数,假设调用这个函数,这个命令就叫做内建命令

相关推荐
云姜.7 小时前
TCP协议特性
服务器·网络·tcp/ip
迎仔7 小时前
E-自动化:GPU驱动维护自动化
运维·gpu·gpu驱动
代码游侠7 小时前
复习——Linux设备驱动开发笔记
linux·arm开发·驱动开发·笔记·嵌入式硬件·架构
The森7 小时前
Linux IO 模型纵深解析 03:同步 IO 与异步 IO
linux·服务器
草莓熊Lotso8 小时前
Linux 文件描述符与重定向实战:从原理到 minishell 实现
android·linux·运维·服务器·数据库·c++·人工智能
历程里程碑8 小时前
Linux22 文件系统
linux·运维·c语言·开发语言·数据结构·c++·算法
wdfk_prog16 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
七夜zippoe16 小时前
CANN Runtime任务描述序列化与持久化源码深度解码
大数据·运维·服务器·cann
盟接之桥17 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造