『 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue 前端实现login页登陆 验证码

实现效果 // template <el-form :model"loginForm" :rules"fieldRules" ref"loginForm" label-position"left" label-width"0px" class"login-container"><span class"tool-bar"></sp…

解决VSCode按住Ctrl(or Command) 点击鼠标左键不跳转的问题(不能Go to Definition)

问题出现 往往在升级了VSCode以后&#xff0c;就会出现按住Ctrl&#xff08;or Command&#xff09; 点击鼠标左键不跳转的问题&#xff0c;这个问题很常见。 解决办法 1 进入VScode的首选项&#xff0c;选择设置 2 输入Go to definition&#xff0c;找到如下两个设置&#…

逸学java【初级菜鸟篇】11.多线程【多方位详解】

hi&#xff0c;我是逸尘&#xff0c;一起学java吧 目标&#xff08;任务驱动&#xff09; 本章没有任务目标&#xff0c;略述概述多线程一隅&#xff0c;全是精华。 线程 进程 在提到线程是什么之前我们还需要提到另一个名词 他就是进程 进程&#xff1a;是指一个内存中运…

如何删除mac苹果电脑上面的流氓软件?

在使用苹果电脑的过程中&#xff0c;有时候我们也会遇到一些不需要的软件。无论是因为不再需要&#xff0c;或者是为了释放磁盘空间&#xff0c;删除这些软件是很重要的。本文将为大家介绍怎样删除苹果电脑上的软件&#xff01; CleanMyMac X全新版下载如下: https://wm.make…

springboot + vue 智能物流管理系统

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

FL Studio(水果软件)2024最新中文版云盘下载

如今&#xff0c;越来越多的音乐人选择使用音乐制作软件来进行音乐的创作&#xff0c;一台电脑、一款软件以及一个外接MIDI就是一个小型的音乐工作站。FL Studio成了音乐界萌新的首选&#xff0c;目前最新的版本为FL Studio2024版本。 你可以不知道如何做音乐&#xff0c;但是…

你对SPA单页面的理解,它的优缺点分别是什么?

面试官&#xff1a;你对SPA单页面的理解&#xff0c;它的优缺点分别是什么&#xff1f;如何实现SPA应用呢 一、什么是SPA SPA&#xff08;single-page application&#xff09;&#xff0c;翻译过来就是单页应用SPA是一种网络应用程序或网站的模型&#xff0c;它通过动态重写当…

微信小程序 slider 翻转最大和最小值

微信小程序 slider 翻转最大和最小值 场景代码示例index.wxmlindex.jsutil.js 参考资料 场景 我想使用 slider 时最左边是 10 最右是 -10。 但是想当然的直接改成<slider min"10" max"-10" step"1" /> 并没用。 查了文档和社区也没有现成…

HarmonyOs 4 (二) HelloWord

目录 一 开发工具下载安装1.1 下载安装包1.2 下载相关依赖 二 开发者注册与个人实名认证三 第一个程序2.1 创建第一个程序2.2 认识开发者界面2.3 目录结构认识2.3.1 父目录认识2.3.2 AppScope 目录2.3.3 entry目录2.3.3.1 ets 目录2.3.3.2 resources目录 2.3.4 认识配置文件2.3…

(四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)

一、无人机模型简介&#xff1a; 单个无人机三维路径规划问题及其建模_IT猿手的博客-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、Tiki-taka算法&#xff08;TTA&#xf…

SQL Server 2016(创建数据库)

1、实验环境。 某公司有一台已经安装了SQL Server 2016的服务器&#xff0c;现在需要新建数据库。 2、需求描述。 创建一个名为"db_class"的数据库&#xff0c;数据文件和日志文件初始大小设置为10MB&#xff0c;启用自动增长&#xff0c;数据库文件存放路径为C:\db…

Python 网络爬虫(一):HTML 基础知识

《Python入门核心技术》专栏总目录・点这里 文章目录 1. 什么是 HTML2. HTML 的特点3. HTML 的标签和属性4. HTML 的结构4.1 文档类型声明4.2 根元素4.3 头部部分4.4 主体部分4.5 表格标签4.6 区块4.7 嵌套和层次结构4.8 表单4.9 注释 5. HTML 交互事件 大家好&#xff0c;我是…

C#文件夹基本操作(判断文件夹是否存在、创建文件夹、移动文件夹、删除文件夹以及遍历文件夹中的文件)

目录 一、判断文件夹是否存在 1.Directory类的Exists()方法 2. DirectoryInfo类的Exists属性 二、创建文件夹 1. Directory类的CreateDirectory()方法 2.DirectoryInfo类的Create()方法 三、移动文件夹 1. Directory类的Move()方法 2.DirectoryInfo类的MoveT…

Docker容器间网络共享

Docker容器间网络共享 1、新建网络2、容器绑定网卡3、验证 Docker环境中为了一套应用部署多个环境、并且不修改配置文件的情况下&#xff0c;做到一键部署。要求不同容器直接的网络交互&#xff0c;使用容器名称。 网络相关常用命令 #查看网络内部信息docker network inspect b…

应用于智慧零售的AI边缘计算盒子+AI算法软硬一体化方案

中国是世界上最大的消费市场&#xff0c;零售行业拥有极大的发展潜力&#xff0c;阿里、腾讯两大互联网巨头正在加紧、加大布局&#xff1b; 信迈智慧零售方案可涵盖快消行业、服饰行业、餐饮行业、酒店行业、美家行业、消费电子行业、新零售商行业、服饰连锁、大卖场/商超、百…

详解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. 打包和压缩文件 …

39.从0到上线三天搭建个人网站(第三天)

点赞收藏加关注&#xff0c;你也能住大别墅&#xff01; 一、第三天主要工作 1.完成detail页面的开发 2.将所有数据以及部分静态资源存在uniCloud&#xff0c;为以后做管理后台做准备 3.创建云对象getData&#xff0c;在beforecreate&#xff08;&#xff09;中获取数据 4.…

【漏洞复现】智跃人力资源管理系统GenerateEntityFromTable.aspx接口存在SQL注入漏洞 附POC

漏洞描述 智跃人力资源管理系统是基于B/S网页端广域网平台,一套考勤系统即可对全国各地多个分公司进行统一管控,成本更低。信息共享更快。跨平台,跨电子设备。智跃人力资源管理系统GenerateEntityFromTable.aspx接口处存在SQL注入漏洞,攻击者可通过该漏洞获取数据库中的信…

国内首所国际职业培训学院落户深圳盐田揭幕开业

11月26日&#xff0c;中科国药•中科大有大健康上市企业孵化平台迎来了国内首所国际职业学院——深圳市盐田区国际职业培训学院的正式落成与揭幕仪式。中科大有高新科技有限公司董事长、长江商学院MBA\FMBA金融导师、深圳市中科国药生物医药研究院理事长、深圳市盐田区国际职业…

​iOS Class Guard github用法、工作原理和安装详解及使用经验总结

iOS Class Guard是一个用于OC类、协议、属性和方法名混淆的命令行工具。它是class-dump的扩展。这个工具会生成一个symbol table&#xff0c;这个table在编译期间会包含进工程中。iOS-Class-Guard能有效的隐藏绝大多数的类、协议、方法、属性和 实例变量 名。iOS-Class-Guard不…