一.环境变量
在Linux中自己写的程序必须要带路径才能运行,相对路径或是绝对路径,但是像ls pwd这样的程序,不带路径也能运行。
当你想要运行一个程序时:
- 如果带有路径的话,则直接将对应路径的程序加载进内存,变为进程,执行代码。
- 如果不带路径的话,则操作系统会去系统默认路径下搜索,没有找到则报错。
这个系统默认路径就是PATH环境变量,它里面存放了一些经常需要执行的命令路径,有了环境变量后,我们执行程序时,不用加路径,操作系统也能找到对应的位置。
像ls,touch这样的命令,它的路径已经存放在了对应的PATH环境变量里,我们自己写的程序的路径没有在PATH中,所以在查找时,找不到就报错了。只要将我们写的程序地址,加入到PATH环境变量里,就不会报错了。
1.1 概念
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
- 环境变量本质上是shell进程内部的一张表,当启动shell时,从用户的配置文件读取信息,初始化环境变量表
- 同时,在命令行中可以创建shell本地变量
1.2 查看环境变量
1.2.1 echo 查看某个环境变量
1.2.2 env 查看环境变量
- PATH :系统默认搜索路径
- LOGNAME:登录SHELL的用户
- USER:当前正在使用的用户
1.2.3 set 查看本地变量和环境变量
1.2.4 unset 取消本地变量和环境变量
1.2.5 export 将本地变量导入环境变量表中
1.2.6 putenv
- 防止putenv里面出现指针问题。防止指针内容改变导致环境变量一直变化
1.3 代码中使用环境变量
在bash上运行的程序都是bash的子进程,在创建子进程时,父进程将它的环境变量表传递到子进程中,所以子进程可以访问环境变量表,这也说明了环境变量表具有全局属性,但是bash中的本地变量不能传递给子进程,只能在bash内部使用。
- 使用main函数参数来获取
env是一个指针数组,是一个环境变量表,最后一个位置总是为NULL,所以结束的判断为env[i]
1 #include<stdio.h>
2 #include<unistd.h>
3
4
W> 5 int main(int argc, char* argv[], char* env[])
6 {
7 int i = 0;
8 for (; env[i]; ++i)
9 {
10 printf("env[%d], %s\n", i, env[i]);
11 }
12 return 0;
13 }
- 使用全局变量environ来获取
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4
W> 5 int main()
6 {
7 extern char** environ;
8
9 for (int i = 0; environ[i]; ++i)
10 {
11 printf("environ[%d], %s\n", i, environ[i]);
12 }
13 return 0;
14 }
15
- 使用函数获取(推荐)
上述两种方法需要程序员自己遍历环境变量表来获取对应的环境变量,使用不方便,使用函数获取更为简单。
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4
W> 5 int main()
6 {
7 char* path = getenv("PATH");
// putenv 可以导入环境变量
8 if (path != NULL)
9 {
10 printf("%s\n", path);
11 }
12 return 0;
13 }
14
二.命令行参数
main参数一般有三个int main(int argc, char* argv[], char* env[])
- argv:指针数组,类似于env环境变量表,存放的是一个个字符串,最后一个位置是NULL
- argc:表示argv里面有几个字符串
1 #include<stdio.h>
2 #include<unistd.h>
3 #include<stdlib.h>
4
W> 5 int main(int argc, char* argv[], char* env[])
6 {
7 int i = 0;
8 for (; i < argc; ++i)
9 {
10 printf("argv[%d]->%s\n", i, argv[i]);
11 }
12 return 0;
13 }
14
通过上述观察,可以很清晰的看出,argv表是由bash父进程制作(在命令行输入的),传递给子进程的。
第一个参数是可执行程序,之后的参数作为命令行选项。
- ls -a -l 就是传递命令行参数,根据参数的不同,执行不同的代码逻辑