1、认识
在云服务器上写程序时,最终的执行需要./文件名,点表示当前目录,/是文件分隔符,之后就会打印程序,这是用户的操作;而系统则不必这样做,这是因为系统有环境变量的支持。环境变量中有个常见的PATH,查看环境变量用这个指令echo $。执行就会出现一个路径,也就是PATH的路径,我们写的程序由于不在这个路径里,自然也就无法自动执行,所以需要用户自己指定路径。而系统命令,比如ls,用which ls查看路径,发现它的路径可以在PATH的路径里找到,所有调用ls时不需要指定路径。
要在PATH里添加自己的路径的话,命令:export PATH=$PATH:路径。这样可以不改变原有路径而添加新路径。当然也可以用cp -rf 文件名 /usr/bin指令把路径拷贝过去,也可以在系统目录里查看到,文件名和/usr之间有空格。
实际上像这样把可执行程序拷贝到系统默认路径下就相当于Linux的软件安装。而卸载,rm /usr/bin/文件名 -rf,就是删除路径。
通过以上例子,可以这样理解环境变量:它是由系统维护的,在特殊场景的变量。环境变量可以帮助编译器编译用户写的代码。
常见的环境变量:
PATH:指定命令的搜索路径
HOME:指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL:当前Shell,它的值通常是/bin/bash。
想查看某一个环境变量的话, echo $环境变量名,查看系统环境变量的话,env即可。
很多系统展现出来的规定都是依靠环境变量去实现的。
和环境变量相关的命令:
1、echo:显示某个环境变量值
2、export:设置一个新的环境变量
3、env:显示所有环境变量
4、unset:清除环境变量
5、set:显示本地定义的shell变量和环境变量
2、通过代码获取环境变量
1、手动获取
int main(int argc, char* argv[], char* envvp[])
{
//envp就是环境变量的指针数组,每一个指向一个字符串,最后一个指向字符串的指针的下一项会指向NULL
for(int i = 0; envo[i]; i++)
{
printf("envp[%d]->%s\n", i, envp[i]);
}
return 0;
}
通过这个程序打印出来的就是传递给当前进程的环境变量表。每个字符串就是环境变量字符串。
假如不传参,我们也可以拿到环境变量。environ是一个全局变量,char**类型,相当于char* []
int main()
{
extern char** environ;
//envp就是环境变量的指针数组,每一个指向一个字符串,最后一个指向字符串的指针的下一项会指向NULL
for(int i = 0; envo[i]; i++)
{
printf("envp[%d]->%s\n", i, envp[i]);
}
return 0;
}
2、函数获取
但环境变量不需要用户自己去遍历。使用特定的函数可以获取。getenv函数,可根据变量名获取变量。这个需要头文件<stdlib.h>。
int main()
{
char* user = getenv("USER");
if(user == NULL) perror("getenv");
else printf("USER: %s\n", user);
return 0;
}
把user换成pwd,pwd这个指令也就写好了,如果把当前目录放到根目录下,export PATH=$PATH:路径,那么pwd和自己写的pwd查看到的都只有一个/。
如果想让写的这个程序只有自己可以执行:
#define NAME "zyd"
int main()
{
char* own = getenv("USER");
if(strcmp(own, NAME) == 0)
{
printf("程序正常执行");
}
else
{
printf("当前用户%s非本人, 不能运行\n", own);
}
return 0;
}
3、重新认识环境变量
环境变量本质上是一个内存级的一张表,这张表由用户在登陆系统的时候,会给特定用户形成属于自己的环境变量表。每一个环境变量都有自己的应用场景。每一个元素都是kv的。
我们手动改环境变量时,再次运用变量会被改变,而重启一下就恢复正常了。环境变量在没有存入数据的时候,它放在系统的配置文件。在根目录下,ls -al,看到.bash_profile和.bashrc,这两个文件就是shell脚本,里面存放配置文件。
环境变量是在哪里建立的?启动Xshell后,内存会开一个Xshell进程,这个进程会读取命令和命令行,并且加载进环境变量这个表;当我们export一行代码后,比如a=‘!!!’,系统就会把它读成一个字符串"a=‘!!!’",并且由表中空着的指针去指向这个字符串,再重新设定NULL,当然空间不够就扩容。而创建子进程后,作为父进程,环境变量就会被传到子进程里。环境变量是由bash整理的。
在程序文件里,可以写printf(“myenv: %s\n”, getenv(“a”)); 运行成功后,我们就可以看到自己搞的这个a变量。
改环境变量用export是因为这样才可以继承到子进程,如果不加export,也可以写成功,但这将会是shell的本地变量,只在shell内部有效,我们写一个程序文件去调用它无法调用,这样的解决办法就是export 变量名就可,因为它已经被建立了,这时候export就是把本地变量添加到表里了。用env |grep 变量名就可以查看到变量。
unset可以取消本地和环境变量。
之后的博客中还会深入一下环境变量。但这篇也基本全了。
结束。