环境变量简介

欢迎拜访: 羑悻的小杀马特.-CSDN博客

本篇主题:环境变量

制作日期:2024.11.22

目录

一·概述:

二·对bash的两个表介绍:

三·环境变量的操作:

3.1命令行操作:

[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代码操作:

[3.2.1 getenv("NAME") :](#3.2.1 getenv("NAME") :)

[3.2.2 environ :](#3.2.2 environ :)

3.3vim修改操作:

四.额外补充:

4.1本地变量:

4.2bash脚本文件:


一·概述:

环境变量(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脚本文件:

如:我们写了一个test.sh

直接用命令

sh test.sh

这样就运行了。

相关推荐
gywl1 小时前
openEuler VM虚拟机操作(期末考试)
linux·服务器·网络·windows·http·centos
日记跟新中3 小时前
Ubuntu20.04 修改root密码
linux·运维·服务器
码农君莫笑3 小时前
信管通低代码信息管理系统应用平台
linux·数据库·windows·低代码·c#·.net·visual studio
BUG 4043 小时前
Linux——Shell
linux·运维·服务器
大霞上仙3 小时前
Linux 多命令执行
linux·运维·服务器
晨欣3 小时前
Kibana:LINUX_X86_64 和 DEB_X86_64两种可选下载方式的区别
linux·运维·服务器
AI青年志4 小时前
【服务器】linux服务器管理员查看用户使用内存情况
linux·运维·服务器
dessler4 小时前
Docker-run命令详细讲解
linux·运维·后端·docker
PyAIGCMaster5 小时前
ubuntu装P104驱动
linux·运维·ubuntu
奈何不吃鱼5 小时前
【Linux】ubuntu依赖安装的各种问题汇总
linux·运维·服务器