环境变量简介

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

这样就运行了。

相关推荐
即将头秃的程序媛1 小时前
centos 7.9安装tomcat,并实现开机自启
linux·运维·centos
fangeqin1 小时前
ubuntu源码安装python3.13遇到Could not build the ssl module!解决方法
linux·python·ubuntu·openssl
爱奥尼欧2 小时前
【Linux 系统】基础IO——Linux中对文件的理解
linux·服务器·microsoft
超喜欢下雨天3 小时前
服务器安装 ros2时遇到底层库依赖冲突的问题
linux·运维·服务器·ros2
tan77º4 小时前
【Linux网络编程】网络基础
linux·服务器·网络
笑衬人心。4 小时前
Ubuntu 22.04 + MySQL 8 无密码登录问题与 root 密码重置指南
linux·mysql·ubuntu
chanalbert6 小时前
CentOS系统新手指导手册
linux·运维·centos
星宸追风6 小时前
Ubuntu更换Home目录所在硬盘的过程
linux·运维·ubuntu
热爱生活的猴子7 小时前
Poetry 在 Linux 和 Windows 系统中的安装步骤
linux·运维·windows
myloveasuka7 小时前
[Linux]内核如何对信号进行捕捉
linux·运维·服务器