文章目录
- 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