目录
一.命令行参数
1.定义
运行程序时,在命令行里跟在程序名后面输入的额外数据,用来给程序传递指令、文件路径、配置、选项等。
比如:

其实就是程序内部就能读取这两个字符串,实现不同逻辑。
2.main函数的参数
main函数的参数就是负责接收命令行参数的
int main(int argc, char *argv[], char *envp[]);
1.argc代表参数个数,统计范围包含程序名本身,最终参数总数量就等于 argc 的数值。
2.argv是存放命令行参数的字符串数组,类型为字符指针数组,数组里的每一个元素都是独立字符串。
------其中 argv 0 固定存储程序名或程序所在路径;argv 1、argv 2 及后续元素,依次对应我们在命令行中手动输入的各个参数。
- *char envp\[\]环境变量数组。
我们来测试一下:

效果:

作用:
main函数的参数接收参数之后会完成相应任务
演示:


二.环境变量
1.是什么
1.1定义
环境变量是操作系统给进程传递的一组「键值对」配置,用来保存系统运行环境的信息和为进程运行提供相应信息,保障运行。
键=值(比如PATH=/usr/bin:/bin)
解释一下:比如我们并没有在代码里完整写出函数库的位置,但是代码却能正常运行,说明该进程的环境变量表已经记录了
1.2分类(环境文件)
按生命周期分类:
- 临时环境变量:
关闭终端、会话结束后自动失效
通过终端
export命令临时创建
2.永久型:
由系统 / 用户配置文件定义,重启终端、重启系统依然有效。
按作用域划分:(存在位置)
1.系统环境变量
系统所有登录用户、所有进程均生效
配置文件(全局,需管理员权限修改):
/etc/profile/etc/bashrc/etc/environment
2.用户环境变量
作用域:仅当前登录用户生效,其他用户无法读取。
在用户家目录 下
~/.bashrc~/.bash_profile/~/.profile
1.3.进程中的环境变量表

1.环境变量表组织形式
纯文本,一条条 key=value 字符串(环境变量本体)、命令行参数字符串。存在于栈中
environ 是一个全局字符指针数组,依靠该指针遍历和命令参数对比即可寻找到对应变量,相等于envp

2.进程中环境变量表的创建
最开始的:
来自 Linux 系统中的几类磁盘配置文件,系统启动 / 用户登录时会自动读取这些文件,生成 Shell 进程的环境变量表。
后续进程:
新进程(子进程)诞生时,会完整拷贝父进程的环境变量表,如果要改变,就会写时拷贝
2.认识一些环境变量
2.1.PATH
作用:
Shell 执行命令时,若不写完整路径,系统会按 PATH 里的目录顺序依次查找可执行文件。
由相关配置文件形成(给进程)(永久环境变量):
系统级(全局,所有用户)
/etc/environment:系统底层基础 PATH
/etc/profile//etc/bashrc:补充、修改全局 PATH用户级(仅当前用户)
~/.bash_profile/~/.profile/
~/.bashrc:个人追加自定义路径后加载的配置会覆盖 / 拼接前面的 PATH
相关操作:
1.查看

2.添加自己的文件路径
PATH=路径//直接覆盖
PATH=$PATH:路径//尾部接上

2.2.其它环境变量
HOSTNAME:指主机的名称。
SHELL:bash所在的路径。
HISTSIZE:记录历史命令的条数,这就是为什么我们能够查找历史命令的原因。
USER:创建bash 的用户。
PWD:当前的工作路径。
OLDPWD:最近切换的一次路径。
MAIL:当前用户的邮件存放目录。
HOME:代表家目录
3.对环境变量的操作(增删查改)
3.1.查看
1.echo $变量名 //查看单个变量
2.env//查看所有环境变量
3.main的参数env:在代码中查看


4.系统调用:getenv()
char *getenv(const char *name)
前面操作的底层实现都是environ指针数组实现的:通过遍历搜寻数组
比如getenv的实现:
extern char **environ;
char *getenv(const char *name)
{
int i = 0;
// 1. 遍历整个环境变量表
while (environ[i] != NULL)
{
char *str = environ[i];
char *eq = strchr(str, '='); // 找分隔符 =
// 2. 对比 key 名称
if (eq != NULL &&
(eq - str) == strlen(name) &&
!strncmp(str, name, eq - str))
{
// 3. 匹配成功:返回 = 后面的值的指针
return eq + 1;
}
i++;
}
return NULL; // 没找到
}
3.2增加
临时:
export 变量名=变量值

永久:直接编辑shell配置文件(脚本)
1.vim ~/.bashrc//打开
2.export USER_VAR="用户永久变量"
3.source ~/.bashrc//立即生效
3.3删除
临时删除(当前会话)
unset 变量名
永久删除
- 打开配置文件,删除对应的
export 变量=值行;- 执行
source 文件名生效。
补充:
1.内建命令(Built-in Command)
命令逻辑直接集成在 Shell 程序内部 ,不是独立可执行文件。执行时不创建新进程,在当前 Shell 进程内直接运行。
特点:
执行效率速度快,省去创建进程、读取磁盘、加载程序的开销。
可修改当前 Shell 状态能够直接改动当前 Shell 的工作目录、环境变量、局部变量、终端属性等。
2.常规命令(外部命令 / 磁盘命令)
是独立的可执行文件,存放在磁盘目录(如
/usr/bin、/bin)。执行时 Shell 会调用fork()创建子进程,再通过execve加载该程序运行。