环境变量
- 1.命令行参数
- 2.环境变量:PATH
- 3.其它环境变量
- 4.获得环境变量的方法
- 1.命令操作
- 2.代码操作
- 5.理解环境变量的特性
- 6.本地变量
- 1.内建命令
- 2.Shell脚本
1.命令行参数
- 往命令行输入的字符串,被 bash 进程以空格分割成各种命令行参数。bash 进程创建一张命令行参数表(argv),用来支持选项功能 。
- main 函数的参数 argv(命令行参数表),是程序实现不同子功能的方法。
- 输入的指令同样支持选项功能(指令,大部分都是C写的)
2.环境变量:PATH
- 环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数。
- 我们在编写C/C++代码在链接的时候,不知道我们链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
- 环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
- 要执行一个程序时,系统必须要先找到该程序。我们写的程序需要带上当前路径:./
- 执行系统命令不需要带上./是因为系统中存在环境变量,帮助系统找到目标二进制文件(可执行程序)
- 不推荐将二进制文件拷贝到 usr/bin 路径下。
问题:执行系统命令时,系统为什么会在 usr/bin 路径下查找?
答案:存在环境变量:PATH。环境变量 PATH 中的内容含有多个路径,系统会在这些路径中搜索指令。
用户登入时,系统创建 bash 进程,bash 会读取
系统配置文件
(.bashrc 和 .bash_profile)中的关于环境变量的内容,在 bash 进程内部构成一张环境变量表(指针数组,指向字符串),同时 bash 还可以接收用户的指令,创建命令行参数表。bash 有两张表(命令行参数表,环境变量表)
总结:
- 如果 Linux 系统有10个用户登入时:系统会创建10个bash进程,每一个 bash 进程,都存在命令行参数表和环境变量表。
- 用户登入时,系统创建 bash 进程,bash 进程读取系统配置文件,在 bash 进程内部创建环境变量表。当在命令行输入命令(例如:ls -a -l),先做命令行解析获得命令行参数表,在表中获取可执行文件的程序名,再取指定的环境变量 PATH 中查找,找到就运行,没找到就报错。
- 指令的查找操作是由 bash 进程亲自查找的。
3.其它环境变量
查看环境变量方法:echo $环境变量名
环境变量名:
- HOME:用户家目录
(cd ~ 能被执行的原因:进程 bash 解析命令行,创建命令行参数表,其中的 ~ 去匹配环境变量表中的 HOME)
- SHELL:当前Shell的版本,通常是/bin/bash。
- USER:当前用户。
- LOGNAME:登入用户。
- HISTSIZE:能保存历史命令的总条数。
- HOSTNAME:主机名。
- SSH_TTY:终端设备号。
- PWD:当前工作路径。
- OLDPWD:上一次的工作路径
(cd - 能被执行的原因:进程 bash 解析命令行,创建命令行参数表,其中的 - 去匹配环境变量表中的 OLDPWD)
- 环境变量被 bash 直接使用,间接被用户使用。
- su:提权,USER和LOGNAME没有被修改。
- su -:切换为 root 用户,USER和LOGNAME被修改。
4.获得环境变量的方法
1.命令操作
env
:查看所有的环境变量。echo $环境变量名
:打印环境变量名所对应的内容。export 环境变量名=环境变量内容
:导入环境变量,可以使用 env 命令查看。unset 环境变量名
:删除环境变量。set 变量名
:显示本地定义的 shell 变量/环境变量。
2.代码操作
- main 函数参数
char* env[]
,获取环境变量。
main 函数其实不是程序的入口,main 函数被 _start 函数调用,内部记录了 main 函数参数的个数 arg_count,通过 arg_count 调用不同参数数量的 main 函数。
char* getenv(const char* name)
:根据环境变量名,返回环境变量的内容。
1. 环境变量被子进程所继承,可以通过环境变量做个性化操作。
2. 环境变量对子进程来说是共享的,但倘若子进程修改环境变量会发生写时拷贝。
例如:写一个程序,只有我能执行,即便是 root 用户都无法执行。
- 全局变量:
extern char** environ
(二级指针,指向环境变量表)获取环境变量。
environ 没有包含在任何头文件中,所以在使用时要用 extern 声明。
5.理解环境变量的特性
- 环境变量的全局特性,可以被子孙进程继承。
6.本地变量
set
:查看环境变量和本地变量。unset 本地变量
:删除本地变量。
bash 设置本地变量的原因:
- Shell 是一种脚本语言,需要本地变量支持。
bash i=0; while [ $i -le 10 ]; do echo $i; let i++; done
注意:本地变量不会被子进程所继承,只能在 bash 进程内部使用。
- 一些本地变量具有特殊用途。
PS1='[\u@\h \W]\$ '
:打印命令行。
PS2='> '
:续行。
1.内建命令
export 本地变量
:将本地变量变为环境变量。