欢迎拜访: 羑悻的小杀马特.-CSDN博客
本篇主题:环境变量
制作日期:2024.11.22
目录
[3.1.1 env:](#3.1.1 env:)
[3.1.2 echo $+name:](#3.1.2 echo $+name:)
[3.1.3 export:](#3.1.3 export:)
[3.1.4 unset:](#3.1.4 unset:)
[3.2.1 getenv("NAME") :](#3.2.1 getenv("NAME") :)
[3.2.2 environ :](#3.2.2 environ :)
一·概述:
环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。
环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性。
也就是简单的说是:
常见环境变量:
PATH : 指定命令的搜索路径。
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。
SHELL : 当前Shell,它的值通常是/bin/bash。
查看环境变量方法:
echo $NAME //NAME:你的环境变量名称。
下面我们来讲一下命令行参数:
也就是main函数是有参数的:
argc根据我们在可执行程序后面的参数个数推断,argv数组内放的字符串就是我们命令行所给的参数组成的数组:如ls -al :可以理解成ls是一个把main函数编译好的可执行程序,而后面的-al就是命令行参数;下面用一个例子演示一下:
这样一展示的话,我们就明白了那些指令原来是这么设计的吧。
那问题来了,我们怎么知道这个程序在哪,然后再去main函数里面对应的执行相应命令行参数对应的功能呢? 根据所学的,我们可以明白命令行是bash控制的,那么也就是bash去找。
去哪找:就是环境变量PATH的应用了。
这样就和我们的环境变量联系在一起了。
那么PATH是怎样操作:
下面可能会有个疑问:
为什么此时要加入**./**才能运行, 因为此时生成的a.out可执行文件在当前目录,而没有在PATH中,不告诉它就会默认到这里面找,会找不到,因此这样写如果非要让a.out成立可以把当前路径加在PATH后面:也就是PATH=$PATH:当前路径。但是如果退出来再重新登录就会消失,后面会讲解怎么样才可以导入并且不消失。
二·对bash的两个表介绍:
等后面我们就用可以获得环境变量的environ把这张表打印出来当然也可以用env后面会讲到。
这里我们只需要了解bash是如何操作我们命令行输入的命令的就可。
这里我们讲一个小插点:
我们上面不是讲了PATH的覆盖;如果我们直接把它覆盖而不是后面的"拼接";也就是直接PATH=当前路径;那么此时我们会发现一些指令如ls等都不能用了;而export,cd等却可以这是为啥?
因为我们比如执行的刚刚的a.out等程序,是通过子进程调用完成的,而我们之前学过,子进程默认虽然是和父进程一样数据等,但是会发生写实拷贝:当我们覆盖的是子进程的环境变量;但是父进程没有变化,而像上面export等是父进程bash直接操控的,属于内建命令;故还是可以执行的。
三·环境变量的操作:
3.1命令行操作:
3.1.1 env:
这里就比较简单,演示一下就好,会把整张环境变量参数的表展示出来:
ubuntu展示:
这里我们常见认识这些就可;其中OLDPWD的设计就是为了方便我们su 命令可以正常使用,这些了解一下即可。
3.1.2 echo $+name:
这里的 $:就是对环境变量名字的执行解释。
3.1.3 export:
这里export 环境变量名字=内容;下面展示下效果:
env效果 :
但是这里如果直接用export命令行导入最后只要退出终端,那么导出到env的环境变量就会消失(后面我们会讲述在vim中修改的操作,这样它不会消失只有vim中删掉并且unset掉才会真正消失)
3.1.4 unset:
用来取消导出到或者写入到env中的环境变量;
用法:unset + name
这是我们用export导出进env的环境变量ff=home.:
下面我们用unset去除一下:
3.2代码操作:
3.2.1 getenv("NAME") :
这里它会有一个头文件也就是#include<stdlib.h>;
返回一个字符串,在代码中使用;下面演示一下:
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main(){
const char *who = getenv("USER");
if(who == NULL) return 1;
if(strcmp(who, "sw")==0)
{
printf("这是程序的正常执行逻辑\n");
}
else
{
printf("Only sw!!\n");
}
}
这样我们就会使用它了。
3.2.2 environ :
用的时候必须声明一下;它相当于是一个二级指针,指向的是环境变量表第一个数据(char*);因此可以利用数组的形式去访问这张表(但是一访问就是全部,或者不知道访问哪个的位置;因此一般代码内我们使用getenv()):
#include<stdlib.h>
#include<stdio.h>
extern char **environ;
int main(){
for(int i = 0; environ[i]; i++)
{
printf("environ[%d]-> %s\n", i, environ[i]);
}
}
因此不太建议用。
3.3vim修改操作:
这里我们可以进入vim修改这样就解决了export设置后但是重登系统就会消失的问题。
如果是centos7等就会有.bash_profile,在这里面直接用vim编辑添加就好。下面我们展示一下ubuntu的操作:
回到根目录有个.bashrc的文件用vim打开它(里面是默认补充的)。
接下来我们用vim里面写入格式:export 名字=内容。
但是我们直接echo它的内容是看不到的;需要刷新一下:
1· source ~/.bashrc
2. source ./.bashrc
这两种方式都可以。
当我们unset的时候,虽然env展示的没了,但是一刷新又会出现因此还要在.bashrc里面 删掉才行。
四.额外补充:
4.1本地变量:
这里我们要知道bash既有环境变量又有本地变量(只有bash来操作,它不会像环境变量一样被子进程继承)。
这就是一个本地变量;也就是只有通过bash进行命令行操作才可以执行,也就是说如果bash后的子进程是用不了的。
下面也可以放入环境变量表中。
4.2bash脚本文件:
直接用命令
sh test.sh
这样就运行了。