前言
在 Linux 中,命令行参数和环境变量是程序运行时最重要的两类信息。命令行参数是在运行程序时的内容,比如
ls -l /etc中的-l和/etc,它们告诉程序需要完成什么操作;而环境变量是一组系统配置,如PATH、HOME等,用来影响程序的运行环境。当我们在 bash 中执行命令时,bash 会先准备好一份命令行参数表,再把当前会话的环境变量表一并传递给程序。理解它们的作用,可以帮助我们更好地使用 Linux 命令和配置系统环境。
一、命令行参数
1、是什么
- 我们在Linux的bash窗口输入的每一行命令就是命令行参数
- 例如
ls -a这个命令bash会将它加载到一个指针数组中,这个数组就是命令行参数表,加载到命令行参数表中就是这个格式:["ls","-a"]
2、验证
- 通过C语言中的
main()函数验证“是什么”的概述 -
main函数原型:
int main(int argc,char* argv[],char* env[])-
int argc参数:命令行参数个数 -
char* argv[]参数:命令行参数列表,(数组中的每个元素是字符串,所以是指针数组) -
char* env[]参数:环境变量列表 (等会儿环境变量会讲到)
-
- 重点:在底层实现中
argv的的最后一个参数为NULL(argv[argc]==NULL)
打印输出命令行参数列表:
#include <stdio.h>
int main(int argc,char *argv[])
{
for(int i=0;i<argc;i++)
printf("%s\t",argv[i]);
printf("\n");
return 0;
}
运行结果:
argv[0] = "./code"argv[1] = "1"argv[2] = "2"argv[3] = "3"
二、环境变量
1. 是什么
- 环境变量(
environment variables)⼀般是指在操作系统中⽤来指定操作系统运行环境的⼀些参数- 每登录一个用户,Linux系统都会为其单独创建一个
bash进程,创建bash进程时也会创建环境变量和命令行参数表- 环境变量在系统当中通常具有全局特性
- 是一个指针数组,最后一个参数是
NULL
在内存中组织方式
env ──┬─> "PATH=/usr/local/sbin:/usr/local/bin:"
├─> "HOME=/home/xxx"
├─> "USER=xxx"
├─> "HISTSIZE=1000"
└─> NULL ← 终止
每个元素指向一段以\0结尾的 C 字符串。
2.怎么用
2.1 环境变量常用命令
-
echo: 显⽰某个环境变量值 -
export: 设置⼀个新的环境变量 -
unset:删除环境变量 -
env: 显⽰所有环境变量 -
unset: 清除环境变量 -
set: 查看本地定义的shell变量和环境变量
2.2 添加环境变量
- 前面编译的
code文件,为什么只能使用./code在当前目录下执行,而像ls文件就可以全局页面执行;- 为什么
ls可以这样使用,因为ls编译的二进制文件存放的位置在环境变量PATH中以及声明过;系统会拿ls与PATH中的目录拼接,如果找到对应的二进制文件就执行,没找到就报错- 如何使我们编写的
code文件也在全局页面执行呢,两种方法:
方法一:将code文件放到PATH中存在的目录中
- 多个目录会用
:分隔
xxx@aliyun:/learnlinux/linux/leason12$ sudo cp code /usr/local/sbin/
方法二:将code文件目录添加到PATH中
xxx@aliyun:/learnlinux/linux/leason12$ PATH=$PATH:/learnlinux/linux/leason12
⚠️注意
- 环境变量中都是以键值对的方式存储,
PATH是键,$PATH是取它的值; - 不要直接将要添加的目录赋值给
PATH,这样会覆盖原本的内容,$PATH取值,然后使用:拼接要添加的目录 -
当你重新打开
bash或者打开一个新的bash,PATH中的值会重置(每次一个新的bash都会加载bash_profile文件中的内容,在PATH中添加的目录在文件中并没有记录,就不会加载)
方法三:export
命令行输入的方式添加环境变量,格式:export [变量名]=[变量参数]
2.3 获取环境变量
方法一:main函数的env参数
也就是main的第三个参数
char* env[],以数组形式存储所有环境变量
#include <stdio.h>
int main(int argc,char *argv[],char* env[])
{
for(int i=0;env[i]!=NULL;i++)
printf("env[%d]===> %s\n",i,env[i]);
return 0;
}
运行结果:与env命令查看的结果相同
方法二:getenv()
- 函数原型:
char *getenv(const char *name);,头文件:<stdlib.h>const char *name参数:环境变量的键- 根据环境变量名称获取环境变量内容(成功返回参数首地址
char*,失败返回NULL)
代码示例:仅指定目录下可运行
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char *argv[],char* env[])
{
char* flag=getenv("PWD");
char* pwd="/learlinux/linux/leason12";
if(strcmp(pwd,flag)==0)
printf("当前目录是:%s\n",flag);
else
printf("仅leason12目录可执行\n");
return 0;
}
在/learnlinux/linux/leason12目录下执行:
在其他目录下执行:
方法三:使用extern char **environ变量
environ是一个系统的全局变量,指向环境变量列表的首地址
代码示例:指针访问
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
extern char** environ;
int main(int argc,char *argv[],char* env[])
{
char** i=environ;
while(*i){ //环境变量列表最后一个参数为NULL
printf("environ==>%s\n",*i++);
}
return 0;
}
三、总结
-
命令行参数是一次性的信息,由用户在运行时指定。 -
环境变量是可继承的信息,由父进程传递给子进程。 - 程序可以同时利用两者:
- 命令行参数 → 更高优先级,适合临时配置。
- 环境变量 → 默认配置,全局影响。
以上就是本期全部内容,如果本文对你有点帮助,希望给个三连!下期再见~
(文中哪里的讲解有问题,希望大家能够指出,非常感谢!)