『 Linux 』环境变量

文章目录

    • 🚀什么是环境变量🚀
    • 🚀查看环境变量🚀
      • 🕹️和环境变量有关的命令🕹️
    • 🚀PATH环境变量🚀
      • 🕹️设置PATH环境变量🕹️
    • 🚀HOME环境变量🚀
    • 🚀通过代码获取环境变量🚀
      • 🕹️main函数的形参🕹️
        • 🎮 命令行参数
        • 🎮 利用main函数的第三个参数 -- char * env[]获取环境变量
        • 🎮 环境变量全局性的证明
      • 🕹️利用全局变量 char **environ获取环境变量🕹️
      • 🕹️利用getenv()函数获取环境变量🕹️
    • 🚀Linux中的环境变量与全局变量🚀
      • 🕹️使用set显示变量🕹️


请添加图片描述

🚀什么是环境变量🚀

在c/C++当中,根据不同程序的需要,我们需要为该程序定义某些变量int _data,double _price;

这些变量本质上就是一段内存空间,用来存储程序需要的值或数据;

而在OS中,OS本身在运行当中也需要一些必要的值或者数据,所以在OS当中也会存在一些变量用来存储这些所谓必要的值或者数据参数;

本质上来说环境变量(environment variables)一般是指操作系统中指定操作系统运行环境的一些参数;

一般常见的环境变量有:

  • PATH
    指定命令的搜索路径;
  • HOME
    指定用户的主工作目录(即用户登陆到Linux系统当中时的默认路径);
  • SHELL
    当前Shell,它的值通常为/bin/bash;
    不同的环境变量有着不同的功能;

请添加图片描述

🚀查看环境变量🚀

在Linux当中可以使用env命令打印所有的环境变量;

查看环境变量一般的方式是利用echo命令将环境变量进行打印;
语法:

echo $NAME
  • 其中:

    NAME指环境变量名

    echo命令在Linux中的作用为:用于显示消息或输出其他命令的结果;

    其中若是使用echo打印环境变量时必须使用$符,否则将会直接将环境变量名当作字符串进行打印;

    $ echo PATH
    PATH
    $ echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin
    

请添加图片描述

🕹️和环境变量有关的命令🕹️

  • echo:显示某个环境变量值;

  • export:设置一个新的环境变量;

  • env:显示所有环境变量;

  • unset:清除环境变量;

  • set:显示本地定义的shell变量和环境变量;


请添加图片描述

🚀PATH环境变量🚀

存在一个程序mytest:

其主要的作用为打印hello world;

std::cout << "hello world"<< std::endl ;

$ /usr/bin/ls
Makefile  mytest  test.cpp
$ ls
Makefile  mytest  test.cpp
$ ./mytest 
hello world
$ mytest
-bash: mytest: command not found

已知ls本身就是一个程序,且该程序存在于路径usr/bin/ls;

在该程序中运行了两个程序:mytestls,分别为用户(我)创建的程序mytest与OS中自带的命令程序ls;

但是在使这两个程序运行时的方式并不同,在运行用户的程序时必须使用相对路径或者绝对路径从而运行程序,而在使用OS自身的程序时对路径的需求却可有可无;

很显然这个原因是因为:

本质上的原因是因为在OS当中,无论是运行什么程序都需要保证首先得找到这个程序(即拥有这个程序的路径)才能将该程序进行运行;
而例如ls之类的这样的命令,OS默认是可以直接找到它的,因为这些命令的所在位置都位于环境变量PATH当中;

  • 使用 echo 打印环境变量$PATH:

    $ echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin
    

    从打印出来的结果中可以发现,PATH环境变量以/.../..作为路径,:作为分隔符;

  • 使用which找到ls命令所在路径:

    which命令将在PATH环境变量中寻找某个指令的地址;

    $ which ls
    alias ls='ls --color=auto'/usr/bin/ls
    

    ls的所在路径正是在PATH环境变量当中;

    当在Linux命令行上输入对应的命令时,OS将会在PATH环境变量中寻找该命令的地址;
    顺序为从左至右且以:作分隔符;

    /usr/local/bin,/usr/bin,/usr/local/sbin


请添加图片描述

🕹️设置PATH环境变量🕹️

若是想使自己的程序设置成类似于ls命令;

可以使用两种方式:

  • 将文件移至PATH环境变量的任意路径当中:

    由于PATH环境变量中所存储的命令或者文件都是以路径的形式进行存储;

    所以可以将需要的文件添加至PATH环境变量中的任意路径;

    但是实际上这种方式一般是不可取的:

    虽然以这种方式可以达到预期的效果:使得自己的程序能像命令一样直接运行
    但是对应的有很大的副作用;
    由于PATH环境变量内的文件是OS预先设置好的,由于这种操作在Linux当中相当于将自己写的命令安装至OS中;
    所以如果贸然的将自己的程序添加至路径当中可能会出现污染命令池;

  • 使用export命令将程序加入PATH环境变量:

    语法:

    export PATH=$PATH:程序路径
    

    使用pwd查看可执行程序所在路径以及使用echo命令打印当前PATH环境变量:

    $ pwd
    /home/_user/Begin/my_-linux/Pro23/Environment1201/T1201
    $ echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin
    

    使用export将路径加入到PATH环境变量后再对PATH环境变量进行打印:

    export PATH=$PATH:/home/_user/Begin/my_-linux/Pro23/Environment1201/T1201  # 设置
    $ echo $PATH  # 打印
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin:/home/_user/Begin/my_-linux/Pro23/Environment1201/T1201
    

    此时多了一个/home/_user/Begin/my_-linux/Pro23/Environment1201/T1201的路径;

    不带路径直接运行该程序:

    $ mytest
    hello world
    

    同时使用which也可以在$PATH环境变量中找到该程序:

    $ which mytest
    ~/Begin/my_-linux/Pro23/Environment1201/T1201/mytest
    

    同时这种方式在测试设置$PATH环境变量较为安全;

    因为在不改配置文件的前提下只使用命令行的模式(类似于export)的方式对环境变量进行修改时,修改效果只在当前对话当中;

    当重新登陆该会话时环境变量将恢复:

    $ echo $PATH
    /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin
    

请添加图片描述

🚀HOME环境变量🚀

HOME环境变量即为指定用户的主工作目录(即用户登陆到Linux系统当中时的默认路径);

实际上不同的用户使用echoHOME环境变量进行打印时所得到的结果是不同的:

  #------_user用户下------ 
$ echo $HOME
/home/_user#------root用户下------ 
# echo $HOME
/root

请添加图片描述

🚀通过代码获取环境变量🚀

除了以命令行的形式echo $变量名,env获取环境变量以外也可以通过程序,即以代码的形式获取环境变量;


请添加图片描述

🕹️main函数的形参🕹️

实际上在main函数当中也有三个形参,分别为:

  • int argc

    向main函数传递的参数个数;

  • char *argv[]

    代表执行的程序名称和执行程序时输入的参数;

  • char *env[]
    环境变量信息;

int main(int argc , char *argv[] , char *env[])
{;}

其中int argcchar *argv[]都为命令行参数;


请添加图片描述

🎮 命令行参数

main()函数的参数当中,其中int argcchar *argv[]均为命令行参数;

可以通过这两个参数实现程序在不同的指令下做到不同的运行结果;

存在一个程序(mytest):

#include<iostream> 
using namespace std;int main(int argc , char *argv[] , char *env[])
{for(int i = 0;i<argc;++i){printf("argv[%d]:%s\n",i,argv[i]);}return 0;
}

运行结果:

$ ./mytest -a -b -c -d -e -f
argv[0]:./mytest
argv[1]:-a
argv[2]:-b
argv[3]:-c
argv[4]:-d
argv[5]:-e
argv[6]:-f

可根据该运行结果配合Linux中类似于ls -a等命令进行联想;


请添加图片描述

🎮 利用main函数的第三个参数 – char * env[]获取环境变量

该参数的类型为一个指针数组类型,一个数组内所存储的数据都为char*的指针;

而这个形参即为启动该进程的进程(即这个进程的父进程)传给该进程的环境变量信息;

可以推断出这个指针数组内的char*指针实际上为字符串,而启动该进程的进程将环境变量信息以字符串的形式传递给该进程;
在这里插入图片描述

可以使用一个程序进行证明 (以字符串的形式打印环境变量);

存在一个程序(mytest):

#include<iostream> 
using namespace std;
int main(int argc , char *argv[] , char *env[])
{for(int i = 0;env[i];++i){cout<<env[i]<<endl;}return 0;
}
/*
* env[]为指针数组;
* 遍历该数组并以字符串的形式打印出每个char*字符串;
*/

在Linux下环境变量一般是以字符串的形式利用指针数组进行存储,并以指针数组的形式将其传递给main函数;


请添加图片描述

🎮 环境变量全局性的证明

实际上在一个程序当中,main()函数当中的char*env[]中的环境变量信息来自于其父进程;

即也验证了这个形参即为启动该进程的进程(即这个进程的父进程)传给该进程的环境变量信息;

验证:

  • 存在一个程序(mytest):

    #include<iostream> 
    using namespace std;
    int main(int argc , char *argv[] , char *env[])
    {for(int i = 0;env[i];++i){cout<<env[i]<<endl;}return 0;
    }
    

    可以使用该程序获取当前的所有环境变量;

    通过该程序配合| grep可以查看该程序所接收的众多环境变量中的部分环境变量;

  • 设置临时环境变量:

    在该对话中并不存在一个MYTEST的环境变量;

    所以如果运行该程序并配合| grep MYTEST也将不会有对应的结果;

    $ ./mytest | grep MYTEST
    $ 
    

    使用export命令设置一个临时的环境变量,且该环境变量的值为hello_world;

    $ export MYTEST=hello_world
    
  • 再次运行程序同时再次使用| grep MYTEST搜索该环境变量:

    当再次搜索该环境变量时则可以找到;

    $ ./mytest | grep MYTEST
    MYTEST=hello_world
    

由于根据该程序中所打印的环境变量都是由main()函数的第三个参数char *env[]进行打印的;

由此可以推断出该程序的环境变量是由其父进程所传递,对应的来说一个进程①在运行另一个进程②时,进程①会将自身的环境变量传给进程②;

同时也可以得出一个结论:

环境变量将从配置文件开始以多叉树的形式分发给每一个进程(父子进程间环境变量的传递),因此可以认为环境变量是具有全局属性的;


请添加图片描述

🕹️利用全局变量 char **environ获取环境变量🕹️

同时在Linux中除了该种方式可以获取环境变量以外,还拥有一个全局的环境变量char** environ,且其对于获取环境变量所调用的方式与使用main()函数的第三个参数char *env[]所调用的方式相同;

示例:

#include<iostream> 
using namespace std;
int main(int argc , char *argv[] , char *env[]){extern char **environ; for(int i = 0;environ[i];++i){cout<<environ[i]<<endl;}
}

由于environ并不包含与任何头文件,所以在使用该全局变量前必须使用extern进行声明;


请添加图片描述

🕹️利用getenv()函数获取环境变量🕹️

getenv()函数是包含于<stdlib.h>头文件中的一个函数;

该函数能够通过所给的环境变量(字符串)返回对应的环境变量数据;

其语法为:

char *getenv(const char *name);

示例:

#include<iostream> 
using namespace std;
int main(int argc , char *argv[] , char *env[])
{cout<<getenv("PATH")<<endl;return 0;
}

调用:

$ ./mytest 
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/_user/.local/bin:/home/_user/bin

通常来说大部分情况使用该方式获取对应的环境变量的所使用的频率要高于上面的两种;

其中最主要的原因是若是使用上面的两种方式获取环境变量则将会有大量的环境变量以字符串的形式进行展现,需要使用者进行二次甄别;


请添加图片描述

🚀Linux中的环境变量与全局变量🚀

在上文中所提到的都为环境变量;

而在Linux中不仅可以定义环境变量还可以定义全局变量;

  • 环境变量的定义:

    export var_name=_value
    

    示例:

    $ export Test1=hello_world # 设置环境变量
    $ echo $Test1 # 使用echo打印变量
    hello_world
    $ env | grep Test1 # 可以使用env显示所有环境变量,配合grep显示出对应的环境变量
    Test1=hello_world
    
  • 局部变量的定义:

    var_name=_value
    

    示例:

    $ Test2=HELLO_WORLD # 设置环境变量
    $ echo $Test2 # 使用echo打印变量
    HELLO_WORLD
    $ env | grep Test2 # 可以使用env显示所有环境变量,配合grep显示出对应的环境变量
    $ # 无结果显示
    

请添加图片描述

🕹️使用set显示变量🕹️

在Linux当中可以使用set显示所有的变量 (包括局部变量与环境变量);

$ set | grep Test1
Test1=hello_world
$ set | grep Test2
Test2=HELLO_WORLD

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/189103.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三、C语言常见概念

目录 1. C语言是什么&#xff1f; 3. 编译器的选择 3.1 编译和链接 3.2 编译器的对比 6. main函数 7. printf 和 库函数 8. 关键字介绍 8.1 什么是预编译&#xff1f; 8.2 static 的关键词作用&#xff1f; 8.3 const 的作用 8.4 voliate 的作用 8.5 typedef 的作用…

【MATLAB源码-第93期】基于matlab的白鲸优化算法(BWO)和鲸鱼优化算法(WOA)机器人栅格路径规划对比。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 白鲸优化算法&#xff08;BWO&#xff09; 白鲸优化算法是受到白鲸捕食和迁徙行为启发的一种算法。其主要特点和步骤包括&#xff1a; 1. 搜索食物&#xff08;全局搜索&#xff09;&#xff1a;算法模仿白鲸寻找食物的行为。…

执行npm run dev报Error: error:0308010C:digital envelope routines::unsupported问题

vue2element-ui项目&#xff0c;在执行npm run dev的时候突然报错&#xff1a; (node:19424) [DEP0111] DeprecationWarning: Access to process.binding(http_parser) is deprecated. (Use node --trace-deprecation ... to show where the warning was created) Er…

神策数据荣获 36 氪「WISE2023 未来商业之王 企业服务领域年度企业」

11 月 28 日&#xff0c;36 氪 WISE2023 商业之王大会举办。大会上&#xff0c;WISE2023 年度企业重磅发布&#xff0c;聚焦发掘推动产业发展、为经济增长提供创新动能的企业。神策数据作为专业的大数据分析和营销科技服务提供商&#xff0c;在数百家企业中脱颖而出&#xff0c…

避免客户开发信被限制的方法与策略

开发信是外贸或者出海企业常用的一种开发客户的方式。相较于其他的获客方式&#xff0c;开发信能够更加精准地投放到客户中&#xff0c;并且只需承担较低的成本。但是&#xff0c;由于一些限制管制要求&#xff0c;外贸人员可能会遇到开发新被限制的情况。今天&#xff0c;小编…

WebUI自动化学习(Selenium+Python+Pytest框架)005

基础知识学习完毕&#xff0c;接下来我们开始学习测试框架啦&#xff01;&#xff01;&#xff01; 首先来回顾一下python自带的Unittest框架&#xff1a; Python基础学习016__UnitTest-CSDN博客文章浏览阅读97次。Testcase:测试用例:这个测试用例是UnitTest的组成部分,不是手…

基于SpringBoot校园周边美食探索及分享平台的设计与实现

摘要&#xff1a; 美食一直是与人们日常生活息息相关的产业。传统的电话订餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起&#xff0c;互联网日益成为提供信息的最佳俱渠道和逐步走向传统的流通领域&#xff0c;传统的美食业进而也面临着巨大的挑战&#xff0c…

【Linux系统化学习】揭秘 命令行参数 | 环境变量

个人主页点击直达&#xff1a;小白不是程序媛 Linux专栏&#xff1a;Linux系统化学习 代码仓库&#xff1a;Gitee 目录 命令行参数 环境变量 PATH 查看PATH $PWD 查看环境变量PWD $HOME 查看系统支持的环境变量 获取环境变量 命令行参数 在C/C编程语言中我们有一个…

快速上手PostMan,了解PostMan的基本使用

快速上手PostMan PostMan是一个可扩展的API开发和测试协同平台工具有网页版和独立客户端,推荐安装独立客户端 创建WorkSpace工作空间 类似于GitHub的个人空间可以起到云备份的作用 发送请求 发送Get请求 发送Post请求,设置请求体的格式是表单数据即namevalue的格式 发送Pos…

开源 LLM 安全扫描器

Vigil 是一款开源安全扫描程序&#xff0c;可检测即时注入、越狱以及对大型语言模型(LLM) 的其他潜在威胁。 当攻击者使用专门设计的输入成功影响 LLM 时&#xff0c;就会出现即时注入。这导致 LLM 无意中实现了攻击者设定的目标。 ​ 我对 LLM 的可能性感到非常兴奋&#xff…

2024年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷

2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷 2024 年甘肃省职业院校技能大赛中职组 电子与信息类“网络安全”赛项竞赛样题-B卷A 模块基础设施设置/安全加固&#xff08;200 分&#xff09;A-1&#xff1a;登录安全加固&#xff08;Windows…

智能安防无人机——一种安防巡检新方案

在高新技术的推动下&#xff0c;安防无人机在监控、巡逻等领域的使用频率越来越高&#xff0c;逐渐成为安防救援的重要帮手。安防无人机作为城市安全应急保障体系的重要组成部分&#xff0c;在未来将变得不可或缺。 一、安防无人机的定义及构成 复亚智能无人机全自主巡飞系统由…

系列十六、SpringBoot内置web服务器为Tomcat原理分析

一、概述 作为Spring家族的明星产品&#xff0c;SpringBoot极大地简化了程序员的日常开发&#xff0c;提高了开发效率。我们很容易得借助于SpringBoot就可以快速开发业务代码&#xff0c;不知道大家有没有思考过&#xff0c;当我们在idea中创建了一个SpringBoot项目&#xff0c…

Linux 权限管理

1 Linux 安全模型 AAA认证资源分派&#xff1a; 当用户登录时&#xff0c;系统会自动分配令牌 token&#xff0c;包括用户标识和组成员等等信息 1.1 用户 Linux 中每个用户是通过 User ID&#xff08;UID&#xff09;来唯一标识的。 1.2 用户组 Linux 中可以将一个或者多个…

详解Linux常用命令

目录 1. ps 命令 2. top 命令 3. grep 命令 4. df 命令 5. tail 命令 6. head 命令 7. cat 命令 8. --help 和 man 命令 9. cd 命令 10. mkdir 命令 11. rm 命令 12. mv 和 cp 命令 13. touch 命令 14. vi 或 vim 命令 15. chmod 修改权限 16. 打包和压缩文件 …

LINUX 嵌入式C编程--信号编程

基本概念 信号是事件发生时对进程的通知机制&#xff0c;也可以把它称为软件中断。信号与硬件中断的相似之处在于能够打断程序当前执行的正常流程&#xff0c;其实是在软件层次上对中断机制的一种模拟。信号提供了一种处理异步事件的方法。 信号目的 **信号的目的是用来通信…

IntelliJ IDEA创建springboot项目时不能选择java8的问题解决方案

最近博主也有创建springboot项目&#xff0c;发现了IntelliJ IDEA在通过Spring Initilizer初始化项目的时候已经没有java8版本的选项了。 基于这个问题&#xff0c;有了这篇文章的分享&#xff0c;希望能够帮助大家克服这个困难。 如图&#xff0c;现在创建springboot项目的时…

现代化工安全保障迎来巡查无人机新时代

当今现代化工企业呈现出规模不断扩大&#xff0c;设备逐渐趋向大型化的局面&#xff0c;由此导致化工安全生产面临日益严峻的挑战。然而&#xff0c;随着巡查无人机技术的成熟&#xff0c;这种新的高效手段正在提高化工安全检测的工作效率。 一、传统化工安全巡检存在弊端 化工…

了解 ignore_above 参数对 Elasticsearch 中磁盘使用的影响

在 Elasticsearch 中&#xff0c;ignore_above 参数允许你忽略&#xff08;而不是索引&#xff09;长于指定长度的字符串。 这对于限制字段的大小以避免性能问题很有用。 在本文中&#xff0c;我们将探讨 “ignore_above” 参数如何影响 Elasticsearch 中字段的大小&#xff0c…

Django-Redis

NoSQL&#xff1a;(不支持sql语句) Redis MongoDB Hbase hadoop Cassandra hadoop key-value数据库&#xff08;非关系性数据库&#xff09; redis优势 性能高&#xff0c;读取速度快&#xff0c;存在内存中 Redis应用场景 用来做缓存 在某些特定场景下替代传统数据库---社交…