深入学习Linux: 命令行参数与环境变量详解

发布时间:2026/7/17 2:53:24
深入学习Linux: 命令行参数与环境变量详解 文章目录1. 命令行参数1.1 main函数的参数1.2 命令行参数的作用2. 环境变量2.1 理解一个问题2.2 PATH环境变量2.3 其他环境变量3. C/C代码与进程之间的关系3.1 用代码获取环境变量3.1.1 main函数最多有几个参数3.1.2 shell外壳里的环境变量是哪里来的3.2 获取环境变量的若干种方法3.3 环境变量、本地变量、内建命令3.3.1 创建自己的环境变量3.4 内建命令1. 命令行参数1.1 main函数的参数main函数是可以有参数的。main函数的参数由bash和系统自动传递。命令行参数的本质是一个字符串shell以空格为分割符号切成了若干的子串。细节一命令行参数至少是1argc1argv[0]一定会有元素指向的就是程序名。细节二选项是以空格分割的字符串一个字符也是字符串。细节三argv的本质是一张表元素由argc决定argv[argc]是最后一个且始终为NULL。1.2 命令行参数的作用为什么要有命令行参数命令行参数的本质应用是为了实现一个命令可以根据不同的选项实现不同的子功能。也是Linux中所有命令选项功能的实现方式。问题VS2022有没有命令行参数有的。cat file.txt和cat file.txt如何打印出文件内容本质是通过命令行参数将文件打开打开后读文件打印内容。2. 环境变量2.1 理解一个问题环境变量具有全局属性的根本原因是环境变量可以被bash进程的子进程继承所有在Linux下的子进程都会拥有对应的环境变量。./的本质是相对路径本质是告诉OS用户要执行的bin就在当前路径下。2.2 PATH环境变量Linux怎么知道我应该去哪一个路径下找可执行程序除了去/usr/bin路径下去找还会不会去其他路径下去找Linux系统会存在所谓的环境变量的东西。PATH是该环境变量的变量名echo$PATH以冒号为分割符的多串路径告诉Linux系统如果用户执行一个可执行文件没有指明路径去哪几个路径下去找PATH的本质是协助Linux进行指令查找的环境变量。如何将路径配置到环境变量里就可以执行的时候不带有./PATH[你的路径]你这么写就直接覆盖了PATH$PATH:[你想要添加的路径]总结PATH指定命令的搜索路径。PATH环境变量是全局的。2.3 其他环境变量系统级的变量变量名和变量内容往往具有全局属性。还有没有其他环境变量查询env介绍其余环境变量echo$HISTSIZE记忆你之前使用过的命令默认是1000统计最近使用的1000条命令。echo$OLDPWD记忆用户在运行时上一次所存在的工作路径。echo$SSH_TTY记录终端文件终端窗口不一样输入重定向对内容进行重新输入。PATH指定命令的搜索路径。当你在命令行输入一个命令时系统会按照 PATH 中列出的目录顺序依次查找对应的可执行文件。HOME当前用户的主目录路径。执行cd ~或cd不带参数时就会跳转到该目录。不同用户的 HOME 不同例如/home/zhangsan或/root。SHELL当前用户所使用的 Shell 解释器的路径。常见的有/bin/bash、/bin/zsh等决定了你在终端中使用的命令解释器类型。3. C/C代码与进程之间的关系3.1 用代码获取环境变量3.1.1 main函数最多有几个参数三个参数拿到系统的环境变量表本质是将环境变量表传递给进程。有什么用不同的环境变量有不同的用途。是谁传递的怎么传递的环境变量在bash没有拿到的时候在哪里是谁传递给你的默认是在bash内部的bash本质是一个进程是存储在内存中的是临时表内存级的。我的程序都是bash进程的子进程子进程代码和数据是可以共享的是父进程传递的。所以环境变量具有全局属性。存在两张环境变量表当我们运行程序时bash会fork出一个子进程子进程可以看到父进程的参数。所以说不传参数也能看到环境变量的原因是子进程进行了继承。不传参数怎么获取环境变量子进程都是bash的子进程你可以获得bash的表子进程天然可以继承父进程的数据。语言会默认提供全局变量全局的指针可以指向环境变量表。获取环境变量的第二种方式。需要记住的是环境变量可以被获取。bash有两张表一张是命令行参数表一张是环境变量表。3.1.2 shell外壳里的环境变量是哪里来的bash的环境变量是哪里来的是从Linux系统的配置文件里面来的启动时会把配置文件加载进来所以当时你改的是内存级的数据你关掉Xshell又打开会重新从配置文件中加载。什么是配置文件配置文件又是哪里来的家目录存在两个配置文件.bashrc.bash_profile上面的两个文件其实是相关的。bash在启动时会访问.bashrc文件会将配置文件载入修改一下就可以看到bash被执行echo一行字就可以了。root怎么不执行每一个人都会有自己的家目录改的不是root的配置文件。为什么会给每个用户都搞一个bashwhile:;dopsaxj|grepbash;sleep1;donewhile:;dopsaxj|grepbash;sleep1;echo#############;done每开一个窗口就会有一个bash每个子进程都会加载一个环境变量。最常见mangetenv原理是根据名字查找环境变量的内容根据环境变量名遍历这张表并依次比较遍历成功将右边返回失败返回NULL。如何用C/C获取环境变量char *whoami getenv(USER);3.2 获取环境变量的若干种方法环境变量的作用是限制程序的执行。获取环境变量的三种做法main函数参数char* env[]C语言全局变量char** environ最佳实践getenv(name)测试限制访问用户名。3.3 环境变量、本地变量、内建命令3.3.1 创建自己的环境变量我想创建一个自己的环境变量怎么办test_env12344env|grepTEST_ENV存在但env不到这个叫本地变量。导出成环境变量本质是在将本地变量放到环境变量表里你就可以查到了exportTEST_ENV再次查询就有了。如果这个本地变量本来就没有可以用export直接导也可以exportAAAasdfghj能不能被自己的C语言程序获得getenv(TEST_ENV);子进程是可以获得父进程环境变量的环境变量是全局的本质环境变量是可以被子进程继承的。如何删除环境变量unset[环境变量名]取消命令行的环境变量本质就是将环境变量从环境变量表中删除。其实这些也都是内存级的关掉重新打开就好了。本地变量和环境变量的区别本地变量无法被子进程继承不具备全局性只在bash内部可以访问类比于局部变量和全局变量。为什么要有本地变量cnt0;while[$cnt-le100];doecho$cnt;letcnt;doneshell当中的本地变量是为了支持语法的用于保存一些临时信息。set可以查询系统变量和环境变量。如果我想让我的环境变量关掉打开后还有打开.bash_profile在里面export导入一个环境变量。3.4 内建命令提出问题本地变量只能在shell内部运行不能被子进程继承。echo子进程看不到本地变量是如何被打印的echo这个进程是怎样能打印本地变量的命令和命令是不一样的存在二进制文件级别的命令普通命令内建命令在shell内部自己定义bash自己内部的一次函数调用不依赖第三方路径。内建命令是shell自己的意味着内建命令的执行不需要环境变量。欢迎大家批评指正