前言
我们之前说Linux都可以称之为文件。我们的生成的可执行文件和cd这种命令按理都是可执行文件为什么cd这样的系统命令不需要加上./而我们运行我们的可执行程序的时候却要加上./呢?
答:系统中存在相关的环境变量,保存了这些命令程序的搜索路径
这个环境变量名叫做PATH。
PATH:
查看方式 echo $PATH
我们的系统会在PATH路径内搜索你输入的命令,如果在PATH的内容的路径内就可以直接使用,没有找到就报错。
这就是为什么我们使用cd等指令不需要加上路径的原因。
变量
我们自己也可以创建变量
分为两种
本地变量:
- 创建方式:直接在命令行输入 aaa=100
- 查找方式:echo $aaa 或………
环境变量:
- 创建方式:直接在命令行输入 export bbb=123
- 查找方式:echo $bbb或env | grep bbb 或………
本地变量就是只有在本文件夹里可以使用的变量。
环境变量具有全局性可以在所有部分使用。
查看环境变量的工具
- echo: 显示某个变量值[重点]
- export: 设置一个新的环境变量[重点]
- env: 显示所有环境变量[重点]
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
main函数的参数
main函数的两个参数。
话说为什么我们的Linux可以知道在命令后跟的选项呢?
如 rm -f -r
这个-f -r 是如何得到的呢?
我们其实就可以通过这main()的两个函数得到。
可以看出
我们的main函数保存的argc数就是保存我们的选择数量
argv是一个字符指针数组保存的是我们在命令行敲的指令。
这样我们就可以得到不同的选项我们也就可以通过不同选项给予不同的实现。
我们的main函数其实还有一个参数env
char* env[]
这个参数保存的是当前的所有环境变量
包括我们自己创建的环境变量。
还有一个不是main函数的参数但是是我们C语言维护的一个全局变量。
extern char** environ;
他的结尾也是一个空指针。
和我们的main函数的env参数内容相同。
一个可以通过环境变量名得到环境变量的接口
char* getenv (const char* name);
使用getenv(“环境变量名”);
保存在
<cstdlib>
这个库中
比如我们想得到USER(保存用户名的环境变量)这个环境变量。
环境变量全局性
为什么我们的环境变量具有全局性而我们的本地变量没有全局性呢?
这个我们现在只讲原因
几乎所有进程都是bash的子进程
所以当我们使用命令时及使用bash的子进程时,我们的子进程可以从父进程里继承一些东西,其中就包括了我们的环境变量,这就是我们环境变量具有全局性的原因。
而本地变量则是直接在bash内部定义的变量所以没有被继承。
但是为什么有些命令可以得到本地变量呢?
想echo和export,他们其实bash执行的命令。所以可以得到没有被继承的本地变量。这种命令叫做内建命令
因为这个全局的属性是通过子进程继承父进程的环境变量而得到的。(bash是命令行创建进程的父进程)
本地变量本质上就是bash内部定义的变量不会被子进程继承下去。
echo和export是命令如果也是子进程是无法得到本地变量的,但是echo和export其实是由bash自己执行的(调用自己的对应的函数来完成特定的功能)这种命令叫做内建命令