0

0

【Linux操作系统】环境变量和命令行参数

看不見的法師

看不見的法師

发布时间:2025-07-01 08:18:21

|

976人浏览过

|

来源于php中文网

原创

【Linux操作系统】环境变量和命令行参数
文章目录一.环境变量1.什么是环境变量?2.windows下配置PATH环境变量的原理3.一览常见的环境变量4.指令方式如何查看环境变量5.PATH-存放系统默认搜索路径的环境变量6.两种方法使运行我们写的可执行程序不带路径二.环境变量和本地变量三.和环境变量相关的命令1.echo:显示某一特定环境变量2.export: 设置新的环境变量3.env: 显示所有环境变量4.set:查看本地定义的本地变量四.命令行参数1.cmd下的命令行参数2.main函数的三个参数3.指令的选项制作原理五.代码获取环境变量的三种方式1.char* getenv(const char* str)2.char * env[]3.extern char** environ六.环境变量具体应用1.身份验证2.su 和su -的区别一.环境变量1.什么是环境变量?

环境变量是有特殊用途的系统变量。

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

2.windows下配置PATH环境变量的原理

这里推荐一个B站迷糊老师的一个视频哦:迷糊老师:windows环境变量

学习Java的朋友都经历过配置环境变量:

【Linux操作系统】环境变量和命令行参数

大家在安装JDK的时候,验证是否安装成功,都会在命令行里输入java和javac命令来验证,那你明白这背后的原理吗?

我们知道java和javac其实都是可执行程序.exe:

javac.exe作用: 编译代码

java.exe作用:执行代码

它们在硬盘上都有自己的路径,如下图:

【Linux操作系统】环境变量和命令行参数

那么如果我们在编写好Hello.java代码文件,准备使用javac.exe去编译代码的时候,去使用javac.exe的前提是找到javac.exe,但是如果没有把javac.exe的路径添加到PATH环境变量,也就是没有配置好环境变量的话,系统就找不到javac.exe在哪里,自然也就无法编译Hello.java代码文件。

相反的,如果我配置好了环境变量,你想编译代码的时候,系统就能按照PATH环境变量所提供的路径去找Javac.exe工具,找到后就可以使用起来,编译我们写好的代码!

windows下环境变量和我们今天讲的Linux下环境变量的原理和作用都是类似的,只不过是使用和细节上有差异! 例如:一个环境变量存储的字符串可能由多条路径组成,在windows下和Linux下它们的路径分隔符就有所差异 windows下:

【Linux操作系统】环境变量和命令行参数

Linux:

【Linux操作系统】环境变量和命令行参数
3.一览常见的环境变量代码语言:javascript代码运行次数:0运行复制
<code class="javascript">当前登入用户:USER=li当前登入用户的家目录:HOME=/home/li当前工作目录:PWD=/home/li系统默认搜索路径:PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/li/.local/bin:/home/li/bin</code>
4.指令方式如何查看环境变量
【Linux操作系统】环境变量和命令行参数
【Linux操作系统】环境变量和命令行参数
5.PATH-存放系统默认搜索路径的环境变量

,指令也是程序,那为什么我们执行我们自己写的可执行程序要带./filename路径,而执行系统安装的可执行程序却不要带上任何路径!

其实要执行指令,前提都是要找到该指令的路径,只不过系统安装的可执行程序所在的位置已经被添加到了PATH的环境变量中,而PATH环境变量存放了系统的搜索路径,简而言之就是系统的可执行程序系统能自动搜索到,所以执行时可以不带路径;

但是我们自己写的可执行程序不在系统的搜索路径下,也就是系统自动查找你的可执行程序查找不到,所以你在执行代码的时候得自己带上./相对路径,这用绝对路径来执行也是可以的!

6.两种方法使运行我们写的可执行程序不带路径

要想使得我们

前面我们说到,系统指令所在的目录被添加到了PATH环境变量中, 在执行可执行程序的时候,系统就能通过依次查找PATH中的记录路径来查找到系统指令,所以我只要把我写的可执行程序加入到系统安装的系统指令的目录,这样系统默认的搜索路径中就可找到我写的可执行程序了!

ps:

系统安装的系统指令目录是:/usr/bin/提权su- 切换到root或者sudo 提权执行,拷贝(安装)操作代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos test]$ ./hellohello world[li@VM-8-5-centos test]$ hello-bash: hello: command not found[li@VM-8-5-centos test]$ sudo cp hello /usr/bin[li@VM-8-5-centos test]$ hellohello world</code>

但是这种方法我们极不推荐,因为我们写的可执行程序没有经过测试,就放到系统安装指令的路径,可能会造成指令的污染!

话接上文,我们还可以直接把我们自己写的可执行程序所在路径添加到系统默认搜索路径PATH中.

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">//删除文件用rm -rf,删除一个环境变量/本地变量用unset[li@VM-8-5-centos test]$ sudo rm -rf /usr/bin/hello[li@VM-8-5-centos test]$ ./hellohello world[li@VM-8-5-centos test]$ hello-bash: /usr/bin/hello: No such file or directory[li@VM-8-5-centos test]$ pwd/home/li/1-16/test//export导入环境变量//PATH环境变量名,$PATH环境变量的内容//export PATH=/home/li/1-16/test会覆盖掉原来的$PATH,所以用冒号分隔不同路径,意为相加[li@VM-8-5-centos test]$ export PATH=$PATH:/home/li/1-16/test[li@VM-8-5-centos test]$ hellohello world[li@VM-8-5-centos test]$ </code>
二.环境变量和本地变量

env命令只能够显示所有的环境变量,但是set命令能显示所有的环境变量+所有的本地变量

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos ~]$ myval=100[li@VM-8-5-centos ~]$ env | grep myval[li@VM-8-5-centos ~]$ set | grep myvalmyval=100[li@VM-8-5-centos ~]$ export youval=200[li@VM-8-5-centos ~]$ env | grep youvalyouval=200[li@VM-8-5-centos ~]$ set | grep youvalyouval=200</code>

环境变量类似全局变量,具有全局属性,本地变量类似局部变量,类似局部变量.

全局还是局部属性体现在当创建子进程的时候是否继承父进程能够被继承!

但是注意:环境变量具有全局属性也只是针对本次登入,要永久有效需要修改.bashrc文件!(这涉及到刚登入bash的时候为什么就有环境变量的原因,只需了解,不用深究)

一点PPT
一点PPT

一句话生成专业PPT,AI自动排版配图

下载

ps:

.bashrc在每一个用户的家目录中都能通过ls -al找到代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos ~]$ cd ~[li@VM-8-5-centos ~]$ pwd/home/li[li@VM-8-5-centos ~]$ ls -al | grep .bashrc-rw-r--r--   1 li   li     350 Dec 28 20:51 .bashrc</code>
.bashrc文件内容是脚本语言编写,如果/etc/bashrc存在,就导入/etc/bashrc的内容,每一次登入bash,因为每一个用户的家目录都有这么一个.bashrc文件,所以对应用户的家目录中的.bashrc文件的内容就会被导入到env环境变量中(此条均为自己猜测,个人理解)。
【Linux操作系统】环境变量和命令行参数
环境变量是既然是内存级别的东西,那么下次登入就类似内存掉电失去,需要修改,bashrc相关文件才能永久性更改环境变量。
【Linux操作系统】环境变量和命令行参数

残留问题:我们知道echo是bash的子进程,本地变量不会被父进程在创建子进程的时候被继承,那为什么可以通过echo $本地变量名的方式打印到命令行终端?-----内建命令! 解答: Linux下大部分命令都是通过子进程的方式执行的! 但是,还有一部分命令,不通过子进程的方式执行,而是由bash自己执行,这种命令叫做内建命令!

三.和环境变量相关的命令echo: 显示某个环境变量值export: 设置一个新的环境变量env: 显示所有环境变量set: 显示本地定义的shell变量(本地变量)和环境变量unset: 清除环境a变量1.echo:显示某一特定环境变量代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos ~]$ echo $PWD/home/li</code>
2.export: 设置新的环境变量代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos ~]$ export youval=200</code>
【Linux操作系统】环境变量和命令行参数
3.env: 显示所有环境变量
【Linux操作系统】环境变量和命令行参数
4.set:查看本地定义的本地变量
【Linux操作系统】环境变量和命令行参数

5.unset:清除环境变量

删除文件用rm -rf, 删除一个环境变量/本地变量用unset

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">unset 环境变量名</code>
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos test]$ myval=400[li@VM-8-5-centos test]$ echo $myval400[li@VM-8-5-centos test]$ unset myval[li@VM-8-5-centos test]$ set | grep myval</code>
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">[li@VM-8-5-centos test]$ export youval=800[li@VM-8-5-centos test]$ echo $youval800[li@VM-8-5-centos test]$ unset youval[li@VM-8-5-centos test]$ echo $youval[li@VM-8-5-centos test]$ env | grep youval[li@VM-8-5-centos test]$ set | grep youval</code>
四.命令行参数1.cmd下的命令行参数

在windows下相信你肯定写过所谓的关机小程序,那你肯定用到过这个:

【Linux操作系统】环境变量和命令行参数

或许你会说这不就是一个选项嘛,啊,他确实是选项,可是这选项的背后原理依赖的就是命令行参数!

2.main函数的三个参数

熟悉C语言的童鞋们都知道main函数也是有三个参数,函数main()可以有或没有参数列表,通常最多支持3个参数:

int main()int main(int argc, char *argv[])int main( int argc, char *argv[] , char *env[])

main()函数一般用int或者void形的。用int型定义main更好些,因为在结束的时候可以返回给操作系统一个值以表示执行情况。

这里先讲一讲前两个参数的情况:

argc全称:Argument count 参数个数argv全称:Argument vector 参数向量代码语言:javascript代码运行次数:0运行复制
<code class="javascript">  1 #include<stdio.h>  2 int main(int argc,char* argv[])  3 {  4   for(int i=0;i<argc;i++)  5   {  6     printf("argv[%d]->%s\n",i,argv[i]);  7   }  8   return 0;                                                                                                               9 }</code>

当我们在bash输入命令的时候,输入的命令就以空格为间隔,把命令划分为一个个小的子字符串,然后他们的首字符的地址被存入到argv中,argv是一个指针数组,数组里面存放着argc个元素,每一个元素的类型是char*类型.

3.指令的选项制作原理代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include<stdio.h>#include<string.h>int main(int argc,char* argv[]){  for(int i=0;i<argc;i++)  {    if(argc!=2)    {      printf("Usage:\n\t%s [-a/-b/-c/-ab/-ac/-bc/-abc]\n",argv[0]);      return 1;    }    if(strcmp("-a",argv[1])==0)    {      printf("功能a\n");      return 1;    }    if(strcmp("-b",argv[1])==0)    {      printf("功能b\n");      return 1;    }    if(strcmp("-c",argv[1])==0)    {      printf("功能c\n");      return 1;    }    if(strcmp("-ab",argv[1])==0)    {      printf("功能ab\n");      return 1;    }    if(strcmp("-ac",argv[1])==0)    {      printf("功能ac\n");      return 1;    }    if(strcmp("-bc",argv[1])==0)    {      printf("功能bc\n");      return 1;    }    if(strcmp("-abc",argv[1])==0)    {      printf("功能abc\n");      return 1;    }  }  return 0;}</code>

选项的原理我想通过 看懂上面这段代码你就能够明白了!

【Linux操作系统】环境变量和命令行参数
五.代码获取环境变量的三种方式1.char* getenv(const char* str)

a.getenv参数的介绍:

【Linux操作系统】环境变量和命令行参数
代码语言:javascript代码运行次数:0运行复制
<code class="javascript">/return搜索返回值</code>
【Linux操作系统】环境变量和命令行参数

b.getenv获取指定环境变量

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){  printf("USER:%s\n",getenv("USER"));  return 0;}</code>
2.char * env[]代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include<stdio.h>#include<string.h>int main(int argc,char* argv[],char* env[]){  //env没有个数的限制NULL->0  for(int i=0;env[i];i++)  {    printf("env[%d]->%s\n",i,env[i]);  }return 0;}</code>
3.extern char** environ#include extern char **environ;代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include<stdio.h>#include<string.h>#include<unistd.h>int main(){  //使用第三方变量envieron    //extern告诉编译器,我要用库里的environ这个变量了,链接的时候你给我链接进来  extern char** environ;  for(int i=0;environ[i];i++)  {    printf("environ[%d]->%s\n",i,environ[i]);  }  return 0;}</code>

其实方法2的char * env[] 和方法3中的char** environ本质上是一样的:

char* env[]作为形参,其实是降维成一个二级指针的,可写作char** env,另外参数名也是自定义的,本质是char env 和char* environ就是一个形参一个实参的关系

【Linux操作系统】环境变量和命令行参数
六.环境变量具体应用1.身份验证

我们怎么用环境变量来实现某个用户是否有某个文件的各种权限呐?除了我们之前讲的文件权限的内容之外,我们还有一个前提就是系统怎么知道当前登入用户是谁?

其实这环境变量信息在我们登入shell的时候就被导入进来了,只是一个strcmp的过程!简单,安排!

代码语言:javascript代码运行次数:0运行复制
<code class="javascript">#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){  char* who=getenv("USER");  //strcmp  if(strcmp(who,"root")==0)  {    printf("USER:root\n");    printf("USER:root\n");    printf("USER:root\n");    printf("USER:root\n");    printf("USER:root\n");  }  else   {    printf("权限不足\n");  }  return 0;}</code>
【Linux操作系统】环境变量和命令行参数
2.su 和su -的区别

su和su -都可以从普通用户切换到root,区别在于su切换的前后环境变量的USER都是普通用户

而su -切换的前后环境变量的USER发生从普通用户到root的改变.

su展示:

【Linux操作系统】环境变量和命令行参数

su -展示:

【Linux操作系统】环境变量和命令行参数

从两张图我们可以看出,su-是重登了用户,完全改变了身份,可能和.bashrc的重新加载有关,所以路径也在su-的时候发生改变.

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

410

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

638

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

362

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

263

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

631

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

671

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

618

2023.09.22

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Git 教程
Git 教程

共21课时 | 4.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号