Linux学习笔记之环境变量
目录
1.命令行参数
1.1命令行参数例子
2.环境变量
2.1 PWD
2.2 PATH
2.2.1 把可执行文件拷贝到默认路径下
2.2.2 将环境变量PATH修改
2.3 HOME
2.3 SHELL
2.4 OLDPWD
1.命令行参数
main函数有参数么?大家在日常使用中最常见的是如下形式吧。
#include<stdio.h>
int main()
{
.......
return 0;
}
main函数返回值为int,不写参数,实际上main函数也可以加上参数。如下代码。
int main(int argc,char* argv[])
{
return 0;
}
他的第一个参数表示命令行解析指令个数,第二个表示指令数组。在Linux运行如下代码可得到如图。
#include<stdio.h>
int main(int argc,char * argv[])
{
int i=0;
for(i=0; i<argc; i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
可以发现其实命令行就是以空格为分隔符识别指令的,argv就是字符数组指向对应选项。除了上述写法外还有一种方式,Linux规定argc最后一个元素必须以NULL结尾,这就可以写出如下代码。两种方式效果是一模一样的。
#include<stdio.h>
int main(int argc,char * argv[])
{
int i=0;
for(i=0; argv[i]; i++)
{
printf("argv[%d]:%s\n",i,argv[i]);
}
return 0;
}
其实Linux就是由C语言编写的,我们输入 ls -a -l指令时,命令行就会解释传入对应的程序之中,执行不同的代码。
1.1命令行参数例子
可以通过如下例子查看
#include<stdio.h>
#include<string.h>
int main(int argc,char * argv[])
{
if(argc!=2)
{
printf("指令输入错误\n");
return 1;
}
if(strcmp("opt1",argv[1])==0)
{
printf("模式一\n");
}
else if(strcmp("opt2",argv[1])==0)
{
printf("模式二\n");
}
else if(strcmp("opt3",argv[1])==0)
{
printf("模式三\n");
}
return 0;
}
此时我们就做了个简单的根据用户输入,采取不同输出的程序。
2.环境变量
环境变量是进程维护的具有“全局”属性的变量表,在Linux中可以通过env查看,如下图。
里面包含了许多信息,如主机名,用户名,IP地址,登录用户等。环境变量统一采用 key =value的形式,如 PATH=/home/lhh 如下图。
除了上述的方法外其实main函数还有第三个参数就是环境变量的指针数组,可以在main函数中打印出来,如下代码。
#include<stdio.h>
int main(int argc,char * argv[],char *env[])
{
int i=0;
//env也规定结尾必须为NULL指针
for(i=0; env[i]; i++)
{
printf("env[%d]:%s\n",i,env[i]);
}
return 0;
}
结果如下图。
2.1 PWD
其中PWD表示当前工作路径,除了用env方式打印,还可以使用echo ¥PWD方式打印指定环境变量。如下图。
2.2 PATH
这是环境变量中最重要的变量之一,我们平时运行的程序指令比如ls,top为什么命令行可以执行就是因为path中包含了这些命令的路径,一般在/usr/bin目录下。
查看这个目录文件继续往下翻就会找到一些我们熟悉的命令
当我们直接运行自己编译的程序就会错误找不到程序,加上./才可以运行
也就是说当我们执行一个命令时,如果命令前加上了路径就根据该路径找没加就从默认路径中找,命令行就会根据path中的默认路径去查找这个命令,如果查询不到返回错误,查询到就执行。
我们可以用几下几个小例子来证明
2.2.1 把可执行文件拷贝到默认路径下
切换到超级用户后或使用sudo将可执行文件拷贝在默认目录下就可以运行了.
注意结束后将可执行文件删除,尽量不改变原来系统文件配置。
rm -f /usr/bin/proc
2.2.2 将环境变量PATH修改
可以在命令行中直接使用path等于现有路径,就可以直接运行proceed
PATH=/home/lhh/test/lesson13
但此时大家可能会发现ls,top的命令用不了了。这是因为此时环境变量path中没有了这些可执行文件的路径自然就找不到了。,当然也有一些命令如pwd仍然可以运行,因为这些命令属于内部命令与LS top这些外部命令不同,这些命令嵌入了shell程序中。
但此时不用慌,环境变量是内存级文件,它是命令行程序开始运行时从配置文件中加载出来的,我们只需要关闭命令行打开即可。
在用户的家目录下查看的隐藏文件.bash_profile 可以发现path进程在此时加载的痕迹。如果我们想永久的保存某个路径就可以在此时写在这个隐藏文件之中。
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/home/lhh/test/lesson11
注意要把前面的都加上,每个路径之间以:为分隔符。
2.3 HOME
HOME就是当前用户的家目录路径,也就是我们刚开始登录这个命令行时的目录。
cd ~
想要快速回到家目录的时候就可以用 cd ~,快速回到家目录。
2.3 SHELL
这个环境变量中存了我们命令行程序的地址表示我们使用的是哪个命令行程序。
可以查看他的一些信息。
2.4 OLDPWD
这个环境变量中存了上一次运行的地址,如果想快速切到刚才的地址就可以采用CD -的命令
cd -
3.本地变量
本地变量是由操作系统维护的一些具有临时属性的变量,如下指令
a=100
echo $a
可以得到一百,使用起来类似于环境变量。
可以用set指令查看环境变量和本地变量。如下图。一部分是环境变量一部分是本地变量。
它们的主要区别在继承方式上,当父进程创建子进程的时候,子进程会继承父进程的一些属性,其中就包括了环境变量和命令行参数等但是不会继承本地变量。
子进程与父进程 “共用 ”环境变量表,但是如果子进程修改环境变量的值那么操作系统就会拷贝一份供子进程修改使用,称之为写时拷贝。这个也就是为什么说环境变量具有全局属性,它可以被子进程继承,那么如果有一些环境配置例如主机名,保存地址,用户名等就可以一直的传下去。如下图树形结构一样。因此称环境变量具有全局属性。