2. 环境变量
在操作系统当中由系统在开机之后帮我们维护的一些系统运行时的动态参数
我们自己写的代码,编译之后,运行的时候,为什么要带 ./ ?
- . 代表当前路径 , / 代表路径分割符 . / 可执行程序说明使用相对路径的方式来定位可执行程序
- 自己写的可执行程序和系统自带的指令之间没有区别
那为什么运行系统的指令不需要 ./ ?
- 因为系统指令的路径在环境变量中
1. PATH环境变量
echo 作为打印字符串的一条命令
[yzq@VM-8-8-centos ~]$ echo abcd
abcd
echo $PATH 查看环境变量PATH
[yzq@VM-8-8-centos ~]$ echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mydir/.local/bin:/home/mydir/bin
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mydir/.local/bin:/home/mydir/bin 是以冒号作为分隔符,可以分割出来若干子路径
- pwd、ls指令,会在环境变量所指明的若干路径中一个个去找,找到就会自动执行,不用带路径
- 而我们自己实现的可执行程序,路径不在环境变量里,所以必须由用户自动指明它的路径
证明ls是系统指令
使用which
指令,搜索特定指令所对应的路径
[yzq@VM-8-8-centos my]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
ls的路径为 /usr/bin/ls
环境变量是从左到右,一条一条去查找,只要找到就停下来
ls指令在环境变量的usr/bin
路径下,说明 ls 指令不用带路径
修改自己写的可执行程序对应路径
修改自己写的可执行程序的路径,让其不用添加路径即可运行
创建test.c文件
#include<stdio.h>
2 int main()
3 {
4 printf("hello");
5 }
输入 gcc -o testc test.c
,生成testc可执行程序
输入 which testc
,查询testc的路径
[yzq@VM-8-8-centos my]$ which testc
/usr/bin/which: no testc in (/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/mydir/.local/bin:/home/mydir/bin)
说明 testc路径不在环境变量中
使用pwd
,查询当前testc的路径,
输入 export PATH=$PATH: 当前路径
,将testc的路径新增到到环境变量中
[yzq@VM-8-8-centos my]$ pwd
/home/mydir/my
[yzq@VM-8-8-centos my]$ export PATH=$PATH:/home/mydir/my
[yzq@VM-8-8-centos my]$ testc
hello
直接 使用 testc ,就运行可执行程序
2. env——查看系统环境变量
使用 env ,会出现如下环境变量
这些环境变量都是用户登录的时候设置好的,都是kv的
输入 echo $HOSTNAME
显示当前机器 名字
[yzq@VM-8-8-centos ~]$ echo $HOSTNAME
VM-8-8-centos
输入 echo $SHELL
显示当前所使用的shell
[yzq@VM-8-8-centos ~]$ echo $SHELL
/bin/bash
输入 echo $HOME
,当前为普通用户
[yzq@VM-8-8-centos ~]$ echo $HOME
/home/mydir
HOME环境变量表示当前用户所对应的家目录
切换成root用户后, 此时对应root目录
[root@VM-8-8-centos mydir]# echo $HOME
/root
对于不同登录的人,同一个环境变量里面放的不同的内容,所以环境变量是针对特定的人在特定的场景使用的
3. 获取环境变量
envp
main函数可以带3个参数分别为 int argc 和 char*argv [ ] 和char * envp[ ] (环境变量表)
- char* envp[ ]是一个指针数组,char类型指针都指向字符串,但最后无效内容必须以NULL结尾
创建test.c文件
#include<stdio.h>
2 #include<unistd.h>
3 int main(int argc,char*argv[],char*envp[])
4 {
5 int i=0;
6 for(i=0;envp[i];i++)
7 {
8 printf("envp[%d]->%s\n",i,envp[i]);
9 }
10 }
创建makefile
mytest:test.c
2 gcc -o mytest test.c
3 .PHONY:clean
4 clean:
5 rm -f mytest
输入 make ,使用./mytest 执行可执行程序
发现envp是一张传递给当前进程的环境变量表 char类型指针指向环境变量字符串
environ
若main函数不传参数,还想要拿到环境变量,可以使用 environ
修改test.c文件
#include<stdio.h>
2 #include<unistd.h>
3 int main()
4 {
5 extern char** environ;//声明
6 int i=0;
7 for(i=0;environ[i];i++)
8 {
9 printf("environ[%d]->%s\n",i,environ[i]);
10 }
11 }
使用make, ./mytest执行可执行程序后
使用environ 也可以拿到所有环境变量
getenv 函数获取 (主流)
char* getenv(const char* name);
修改test.c文件
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 int main()
5 {
6 char*user=getenv("USER");
7 if(user==NULL)
8 {
9 perror("getenv");
10 }
11 else
12 {
13 printf("USER:%s\n",user);
14 }
15 }
输入 make, ./mytest 执行可执行程序
[yzq@VM-8-8-centos my]$ ./mytest
USER:yzq
获取到user的名称
4. 总结
- 环境变量本质就是一个内存级的一张表,这张表由用户在登录系统的时候,进行给特定用户形成属于自己的环境变量表
- 环境变量每一个都有自己的用途,有的是进行路径查找的,有的是进行身份认证的,有的是动态库查找的,有的用来进行确认当前路径的等等,每一个环境变量都有自己的应用场景,每一个元素都是kv的
环境变量对应的数据,是从系统的相关配置文件中读取进来的
使用 cd ~
,进入当前目录的主目录中
使用 ls -la
, 显示隐藏文件
这是两个shell脚本,内部包含了配置文件