【Linux】环境变量(初步认识环境变量)

文章目录

  • 1. 环境变量
    • 1.1 基本概念
  • 2. 认识常见环境变量
    • 2.1 PATH
    • 2.2 HOME
    • 2.3 SHELL
    • 2.4 PWD
    • 2.5 USER
  • 3. 理解环境变量

在这里插入图片描述

1. 环境变量

在main函数的命令行参数中,有argc、argv、env三个参数。

  • argc:命令函参数的个数
  • argc:存放每个参数的具体数值

在这里插入图片描述
通过这两个参数,我们可以根据传进来的参数做出判断,来进行相对应的操作,进而达到指令带选项的效果

那第三个参数env是什么呢?- - 环境变量

我们打印出了env中所有的数据,就是环境变量。
在这里插入图片描述

1.1 基本概念

环境变量(environment variables):一般是指在操作系统中用来指定操作系统运行环境的一些参数,将来会以shell的形式传递给所有进程,每个进程都会认识这些参数。

  • 如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。
  • 环境变量通常具有某些特殊用途,而且在系统当中通常具有全局特性。

常见的环境变量有哪些呢?

使用命令env可显示shell自己的环境变量。
在这里插入图片描述

2. 认识常见环境变量

2.1 PATH

PATH:指定命令的搜索路径

大家在敲指令的时候有没有过这样的问题:为什么我自己写的可执行程序执行时要 ./ 指定路径,而执行系统命令时就不用带指定路径呢?

系统在执行指令的时候会去/usr/bin路径下去找
在这里插入图片描述

但是系统为什么会知道命令在/usr/bin路径下呢?
在shell登录的时候,环境变量PATH告诉shell去哪个路径下去查。

  • 使用 echo 命令可以显示某一个环境变量 echo $PATH
    在这里插入图片描述
  • PATH中包含多个路径,以冒号作为分隔符

因此,在shell运行某个命令时,它首先会去PATH中以冒号作为分隔的多个路径下去查找命令。当把PATH中所要求的路径全部找完,依旧没有找到的情况下,就会报出command not found;一旦在任意路径下找到命令,就会将命令加载并执行。

所以我们在执行系统命令时不需要指定/usr/bin路径,它会自己去PATH中找。

当我们把自己的可执行文件的路径添加到PATH中时,我们执行时也就不需要再带路径了

所以可以这样:PATH = $PATH(原有路径) : 我的路径,将自己的路径添加到PATH中。

在这里插入图片描述
但是一旦退出shell,我们所添加的路径就没有了。

所以,PATH的本质:就是一个内存层次的变量,在shell中被维护起来,一旦shell退出再登录,该PATH就不会是我们修改后了,恢复成原有路径了。

那么PATH中最开始的内容是从哪里来的呢?

shell登陆时,会从系统和用户的配置文件中读取对应的环境变量的配置文件,然后形成自己的环境变量表。

所以我们可以将路径添加到配置文件中(家目录下的bashrc)。
在这里插入图片描述

2.2 HOME

HOME:当前用户所对应的家目录(即用户登陆到Linux系统中时,默认的目录)

当我们使用不同的用户登录的时候,系统要创建bash给我们做准备,bash要读取相关的配置文件来初始化PATH、HOME,所以我们登陆时会默认处在家目录下。

bash也是一个进程,所以它有自己的cwd,它就会使用配置好的HOME设置自己的cwd。
在这里插入图片描述

命令行执行的命令,都是bash的子进程,那子进程的task_struct从哪里来呢? - - 拷贝自父进程,所以子进程的cwd也就会继承bash当前的工作路径。

如果bash在不同的工作路径下,当它创建子进程时,路径就会被子进程继承,所以在查看子进程的路径时也会发生变化,子进程所有的操作都是在所继承下来的路径中

在这里插入图片描述

2.3 SHELL

SHELL : 登录时,启动的是哪一个Shell,它的值通常是/bin/bash

2.4 PWD

PW:用于保存当前进程所在的工作路径

除了使用命令函参数获取环境变量以外,还使用系统方式获取环境变量:getenv()
在这里插入图片描述
在这里插入图片描述

为什么要获得该环境变量呢?- - 进程可获得自己的PWD,可用于新建或打开当前路径下的文件

2.5 USER

USER:当前的用户身份
在这里插入图片描述
此时我们就可以在程序中使用getenv(“USER”)来识别用户身份。

环境变量还有很多,后续慢慢介绍。

3. 理解环境变量

  1. 环境变量的本质

其实环境变量就是一张表,表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串
在这里插入图片描述

  1. 环境变量是系统提供的具有“全局”属性的变量

在命令行中,我们是可以定义变量的,但这些变量不是环境变量,是shell维护的,是本地变量。
在这里插入图片描述

那如何查系统中所有的变量呢?- - set命令

如何将一个本地变量变成环境变量呢? export + a(先定义变量) / export a=100(不用定义,直接导)

在这里插入图片描述
一旦一个变量被设置进环境变量表后,它就可以被其它进程访问。

  1. 子进程会继承父进程的环境变量表和命令行参数,不会继承本地变量表

在这里插入图片描述
在子进程中,可以获得父进程的环境变量,也可以取消一个环境变量
使用:unset + 环境变量名
在这里插入图片描述
既然环境变量可以被子进程继承,那它一定也就能被子进程的子进程继承。也就是说环境变量可以被bash之后所有的进程看到,这不就相当于“全局变量”吗?

在这里插入图片描述
上图中,子进程确实可以看到ISRUNNING,所以环境变量具有“全局属性”

除了使用命令行参数env,getenv(),系统中提供了一个第三方变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

SEO之页面优化(三、四——关键词标签与正文中的关键词)

初创企业搭建网站的朋友看1号文章;想学习云计算,怎么入门看2号文章谢谢支持: 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客:阿幸SEO~探索搜索排名之道 (接上一篇。。…

UnityHub下载任意版本的Unity包

1)先打开 // 也可以采用2直接打开 2)也可以直接打开 下载存档 (unity.com) 3)关联起来UnityHub即可

mysql—半同步模式

mysql的并行复制 在172.25.254.20(slave)主机上 默认情况下slave中使用的是sql单线程回放 在master中时多用户读写,如果使用sql单线程回放那么会造成组从延迟严重 开启MySQL的多线程回放可以解决上述问题 mysql> show processlist; 在配置文件中进行编辑 [root…

哪些因素会影响六西格玛效果的显现时间?

在探讨哪些因素会影响六西格玛效果的显现时间时,我们不得不深入剖析六西格玛管理方法的本质及其在企业中的实施过程。六西格玛作为一种旨在通过减少缺陷和变异来提高产品和服务质量的策略,其成功实施并非一蹴而就,而是受到多种复杂因素的共同…

<Rust>egui学习之部件(十二):如何添加右键菜单?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析,主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统:windows 平台:visual studio code 语言:rust 库:egui、eframe 概述 本文是本专栏的第十二篇…

AI+科研|| 如何使用Chat GPT撰写文献综述?7个步骤帮你轻松搞定!

撰写文献综述对许多研究人员和学生来说是一个耗时且复杂的过程。要做到内容全面且符合学术规范,往往需要大量的时间和精力。 然而,有了 ChatGPT 这样的智能工具,文献综述的撰写过程可以变得更加轻松高效。 今天,小编将通过7个简…

一键启动,停止,重启nginx

1.一键启动nginx 启动的时候只能启动当前目录的nginx.exe echo off echo 正在启动nginx cmd /c "start nginx.exe" timeout /t 1 /nobreak > NUL2.一键关闭nginx 关闭的时候只能关闭当前目录的nginx.exe echo off echo 正在关闭nginx cmd /c "nginx -s quit&…

PHP 于小项目:从鉴权说起

PHP 于小项目:从鉴权说起 在当今这个开发技术多样化的时代,选择合适的开发语言和框架常常决定了项目的效率与成败。对于个人开发者,特别是那些进行小型、短期项目的人来说,PHP 是一种特别友好的选择。本文将通过介绍 PHP 实现鉴权…

Acwing 最小生成树

最小生成树 最小生成树:由n个节点,和n-1条边构成的无向图被称为G的一棵生成树,在G的所有生成树中,边的权值之和最小的生成树,被称为G的最小生成树。(换句话说就是用最小的代价把n个点都连起来) Prim 算法…

shell 脚本练习

一、初识shell 文件描述符与重定向 0:标准输入 1:标准正确输出 2:标准错误输出 1>a.txt 与 >a.txt 一样,不写默认前面为1,省略,把标准输出重定向到a.txt中 2>a.txt 将错误输出重定向到a.txt中 &a…

在 CentOS 安装 Python3.7 (没有弯路)

下载Python源码包 wget https://www.python.org/ftp/python/3.7.12/Python-3.7.12.tgz安装前准备 安装依赖组件 yum -y install wget zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gcc make libffi-devel xz-devel解压安装 解…

【Redis】渐进式遍历 数据库管理命令 RESP协议

目录 渐进式遍历 scan 数据库管理命令 切换数据库 获取当前数据库key的个数 删除当前数据库所有的key 删除所有数据库中所有的key RESP协议 渐进式遍历 Redis使用scan命令进行渐进式遍历键,进而解决直接使用keys获取键时可能出现的阻塞问题(因为…

ctf.show---->r3

做题笔记。 下载 查壳。 64ida打开。 先运行一下: ? 不是说4位数值么。。。 得,看ida。 __isoc99_sscanf(dest, "%x", &v5); 懂了 dest指向的是v5 ,那么dest怎么来的: 往上走: 通过strncpy得到 但是问题…

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine(加载外部的.class文件,redefine到JVM里 )举例1:加载新的代码,jad/mc 命令使用举例2:上传 .class 文件到服务器的技巧 二、命令列表 2.…

WEB服务器——Tomcat

服务器是可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,而在开发中真正用到的Web服务器,我们不会自己写的,都是使用目前比较流行的web服务器。 如:Tomcat 1. 简介 Tomcat 是一个开源的轻量…

汽车总线之---- LIN总线

Introduction LIN总线的简介,对于传统的这种点对点的连接方式,我们可以看到ECU相关的传感器和执行器是直接连接到ECU的,当传感器和执行器的数量较少时,这样的连接方式是能满足要求的,但是随着汽车电控功能数量的不断增…

Vue下载静态文件

1、需求:将静态文件放在本地,让用户进行下载。 2、文件位置: ① 原生js:直接将文件放在某个目录或者根目录下 ② Vue:将文件放在根目录的public文件夹下面 3、代码示例: const url "/模板.xlsx"…

Halcon实用系列1-识别二维条码

在做项目时,之前使用的是某康的智能读码器,综合考虑成本,可通过相机拍照来读取图片的二维码,我这边用Halcon来实现。 Halcon代码如下: *创建模型 create_data_code_2d_model(Data Matrix ECC 200, [], [], DataCodeH…

linux蓝屏重启解决方法汇总

前言 linux系统蓝屏(Blue Screen Of Death)是Linux系统用户遇到最严重的故障,任何新手都无法直接解决它。在遇到蓝屏时,最好的解决方案是联系Linux专业供应商或Linux专业支持工程师,因为他们有系统的协议和经验来解决…

dockerfile部署springboot项目(构建镜像:ebuy-docker:v1.0)

文章目录 1、docker部署Mysql2、dockerfile构建镜像1.1、在idea中导入课件中的项目资料\day01\ebuy-docker1.2、修改项目application.yml数据库连接参数1.3、启动项目访问测试:http://localhost:8081/1.4、执行mvn package命令进行项目打包1.5、虚拟机中新建目录/op…