相信大家在C语言学习过程中,一定看到过这样的main函数:
int main(int argc, char *argv[], char *env[])
大多数只有前两个参数,少部分有三个参数,但是大家基本是没有用到过它们,也基本也没有验证过它们是什么,看到这里的大家呢,我建议你们学习完操作系统、命令行操作之后再来探究,学C语言不涉及main函数的参数,可以暂时不看。
main函数的参数 叫做【命令行参数】
int main(int argc, char *argv[], char *env[])
现在来验证一下这几个参数到底是什么吧!
#include
int main(int argc, char *argv[])
{
for(int i = 0; i < argc; ++i)
{
printf("argv[%d] : %s\n", i, argv[i]);
}
return 0;
}
这里就是会发现参数argc是我们命令行中输入的字符串个数,而argv这个字符指针数组是存的是由空格分开的这些字符串的首元素地址
如果我们不加上argc的限制呢?
#include
int main(int argc, char *argv[])
{
for(int i = 0; argv[i]; ++i)
{
printf("argv[%d] : %s\n", i, argv[i]);
}
return 0;
}
我们会发现依旧是输出命令行这些字符,所以我们会发现这个字符指针数组是由NULL结束的。看到这里就和命令行中的指令很相似了,没错,在命令行中的指令就是通过main参数——命令行参数组成的。这样我们也就可以自己创造指令了。通过后面跟的选项不同,来实现不同的功能。
代表的是环境变量,也是以NULL结尾
#include
int main(int argc, char *argv[], char *env[])
{
for(int i = 0; env[i]; ++i)
{
printf("env[%d] : %s\n", i, env[i]);
}
return 0;
}
首先理解一下变量,在我们写编程语言的代码时,会定义很多变量,定义变量的本质就是开辟一段空间,之后给这段空间起名字,写内容。所以今天要学习的环境变量也是一个道理,也是在内存里开辟一段空间,拥有自己的名字与内容。
环境变量:是多个变量,只不过是统称为环境变量。就像我们每个人都有自己的名字,但是我们统称为人。环境变量之间没有任何关系,是操作系统内置的,具有特殊用途的变量。
echo $name //name -> 环境变量名
env
export 环境变量名=值
unset name
#include
#include
int main(int argc, char *argv[], char *env[])
{
for(int i = 0; env[i]; ++i)
{
printf("***env[%d] : %s\n", i, env[i]);
}
return 0;
}
#include
#include
int main()
{
printf("%s\n", getenv("PATH"));
return 0;
}
#include
#include
int main()
{
extern char **environ;
for(int i = 0; environ[i]; ++i)
{
printf("environ[%d] : %s\n", i, environ[i]);
}
return 0;
}
PATH:指定命令的搜索路径
根据上面命令行参数的学习,知道了指令和指令不同的选项就是由命令行参数构成的,所以指令的本质就是一个可执行程序,那运行一个可执行程序需要带其所在的路径。而指令是不需要带其所在的路径的,这是因为我们在输入指令的时候,会自动去其环境变量PATH中去寻找,找到了就直接运行,找不到就会显示没有找到。
添加PATH的搜索路径:
PATH=$PATH:程序所在路径
将可执行程序放在PATH中任意一个路径中(但是由于我们写的指令不够成熟,可能会污染命令池,所以不推荐)
环境变量,其实是一个全局变量,因为我们每一个程序都有环境变量,都可以打印出来,这是因为环境变量可以被子进程继承,而所有在命令行运行的程序都是bash的子进程,那环境变量就会被这些进程继承。经过上面对PATH的理解,我们知道指令是通过从PATH里面的搜索路径中寻找,找到才可以运行。
那操作系统又是怎么知道你所在的路径呢?是因为有一个环境变量PWD来提供的;
操作系统知道用户是谁,是根据环境变量 USER;
我们登陆时默认进入家目录,根据环境变量 HOME。
所以环境变量是给操作系统提供用户的相关信息的。但是我们现在知道的这些环境变量是内存级别的,也就是我们每一次登陆,都会重新初始化环境变量,既上次登陆对环境变量的修改不会在第二次登陆生效。
那每次登陆的时候,是谁给bash环境变量的?
肯定是在磁盘中的一个文件(家目录下的.bash_profile),每一次登陆的时候,这个文件的内容就会给bash。
浅谈一下环境变量的意义之一,可以根据getenv的USER来识别用户身份,以此看其是否具备运行某代码的权限;
#include
#include
#include
int main()
{
if(strcmp("wyd", getenv("USER")) == 0)
{
printf("I am wyd , you can do ...\n");
//wyd代码
}
if(strcmp("root", getenv("USER")) == 0)
{
printf("I am root , you can do ...\n");
//root代码
}
return 0;
}
不是环境变量,不可以被子进程继承,不具有全局属性,只在bash内部有效。
定义一个本地变量,直接name=val就行;
查看变量用set,set可以把本地变量和环境变量都显示出来;
删除变量:unset name