【Linux】环境变量相关笔记
![]()
文章目录
- echo $PATH
- export
- 和环境变量相关的命令
- main(int argc,char* argv[],char *env[])三个参数介绍
- getenv()通过系统调用获取
- su与su - 的区别:
- export
- source 和 .
- 优先级
echo $PATH
是用来查环境变量的
export
从下面的图片当中可以看到,的确是将文件test的路径添加到环境变量当中了。也是能不用使用./
来执行文件了,也可以向ls
命令一样直接使用了,但是这里出现了问题就是别的命令并不能使用了。因为使用了export
是将环境变量里的路径进行覆盖,并不是进行添加在后面。解决的办法就是将自己的xshall完全退出重新登陆。
下面的图片就是将自己的路径添加到环境变量当中,并不是覆盖。
这样之后就不需要在使用./
也可以像ls
指令一样进行使用,
当然并不只是添加路径唯一的方法,也可以将自己的可执行程序进行mv到环境变量的路径下。
在windows中安装软件的的过程就是将可执行文件,配置文件全都拷贝到系统的特定路径下
查看用户名
查看系统的环境变量
env
和环境变量相关的命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- set: 显示本地定义的shell变量和环境变量
main(int argc,char* argv[],char *env[])三个参数介绍
在平时写代码时,main的参数是隐藏的char* env[]==char *env
char env[]是个指针数组,它存储的是个环境变量表,
1 #include<stdio.h>2 #include<unistd.h>3 4 int main()5 {6 extern char **environ;7 for(int i=0;environ[i];i++)8 {9 printf("environ[%d]=%s\\n",i,environ[i]); 10 }11 12 return 0;13 }
environ也是可以直接使用man指令查的,man environ
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>5 6 int main(int argc,char* argv[])7 {8 for(int i=0;i<argc;i++)9 {10 printf("argv[%d]->%s\\n",i,argv[i]); 11 }12 return 0;13 }
上面的图片和代码也就是说明了,argc当中存放的是参数的个数和可执行程序的个数,
而argv当中存放的是可执行程序的地址,和参数的地址。
下面是参数的意义
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>5 void Usage(const char *name)6 {7 printf("\\nUsage: %s -[a|b|c]\\n\\n", name);8 exit(0); // 终止进程9 }10 int main(int argc, char *argv[])11 {12 13 if(argc != 2) Usage(argv[0]);14 15 if(strcmp(argv[1], "-a") == 0) printf("打印当前目录下的文件名\\n");16 else if(strcmp(argv[1], "-b") == 0) printf("打印当前目录下的文件的详细信息\\n");17 else if(strcmp(argv[1], "-c") == 0) printf("打印当前目录下的文件名(包含隐藏文件)\\n");18 else printf("其他功能,待开发\\n"); 19 return 0;20 }
getenv()通过系统调用获取
man同样是可以查到它的用法
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>5 6 #define NAME "zzm"7 8 int main()9 {15 char *own=getenv("USER"); 16 if( strcmp (own,NAME) == 0)17 {18 printf("当前程序已经执行");19 }20 else{21 printf("当前用户非法%s",own);22 }23 return 0;24 }
su与su - 的区别:
所以su 命令时,有 - 和没有 - 是完全不同的,- 选项表示在切换用户身份的同时,连当前使用的环境变量也切换成指定用户的。我们知道,环境变量是用来定义操作系统环境的,因此如果系统环境没有随用户身份切换,很多命令无法正确执行。
export
这里可以理解export把环境变量添加到内存当中,毕竟当我们重启时添加的环境变量就消失了。
添加到环境变量表中,
环境变量是可以被相关的子进程继承的,环境变量具有全局属性。
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>5 6 #define NAME "zzm"7 8 int main()9 {10 printf("myenv=%s",getenv("hello")); 24 return 0;25 }
而当我们并不使用export的时候,并没有将hello1添加到环境变量表当中,只是添加到了本地。
本地变量只对shell内部有效,
所以export的作用就是将本地变量添加到环境变量表当中。
1 #include<stdio.h>2 #include<unistd.h>3 #include<stdlib.h>4 #include<string.h>5 6 #define NAME "zzm"7 8 int main()9 {10 printf("myenv=%s",getenv("hello1")); 24 return 0;25 }
source 和 .
source是和.是一样的。
..bash_profile==source .bash_profile
是让bash_profile中的环境变量立刻生效
优先级
PRI的起始值是80,NI是修正值,当NI=-5,PRI=75,NI=15,PRI=95
NI的范围是在-20-19
PRI的范围60-99