环境变量简介

欢迎拜访: 羑悻的小杀马特.-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

这样就运行了。

相关推荐
zl_dfq11 小时前
Linux 之 【文件】(动静态库的制作与使用、ar、ldconfig)
linux
久绊A12 小时前
磁盘故障处理
linux·运维·服务器
JANG102412 小时前
【Linux】进程通信
linux·运维·chrome
viqjeee12 小时前
RK3288设备树介绍和配置
linux·设备树
末日汐13 小时前
Linux进程信号
linux·运维·服务器
无垠的广袤13 小时前
【工业树莓派 CM0 NANO 单板计算机】YOLO26 部署方案
linux·python·opencv·yolo·树莓派·目标识别
皮蛋sol周13 小时前
嵌入式学习数据结构(二)双向链表 内核链表
linux·数据结构·学习·嵌入式·arm·双向链表
Sleepy MargulisItG13 小时前
【Linux网络编程】网络层协议:IP
linux·网络·tcp/ip
叠叠乐13 小时前
移动家庭云电脑linux docker 容器登陆移动家庭云电脑
linux·运维·docker
Volunteer Technology13 小时前
Centos7安装python和jupyter
linux·python·jupyter