【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,所以环境变量具有“全局属性”

为什么环境变量要具有全局属性呢?

  1. 系统的配置信息,尤其是具有“指导性”的配置信息,如果进程可以使用该信息,那不就是配置生效吗?所以环境变量是系统配置生效的一种表现。
  2. 由于进程具有独立性,所以如果进程间向传递信息,可以通过环境变量来传递数据(只读的)

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

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

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

相关文章

TOGAF框架在企业数字化转型中从理论到实践的全面应用指南

数字化转型的背景与意义 随着全球技术的快速发展,数字化已成为现代企业生存和发展的核心驱动力。企业数字化转型不仅意味着引入新技术,还要求在业务模式、组织架构和运营方式上进行深度变革。然而,数字化转型的实施通常面临诸多挑战&#xf…

vmvare虚拟机centos 忘记超级管理员密码怎么办?

vmvare虚拟机centos 忘记超级管理员密码怎么办?如何重置密码呢? 一、前置操作 重启vmvare虚拟机的过程中,长按住Shift键 选择第一个的时候,按下按键 e 进入编辑状态。 然后就会进入到类似这个界面中。 在下方界面 添加 init=/bin/sh,然后按下Ctrl+x进行保存退出。 init=/bi…

Unity开发绘画板——04.笔刷大小调节

笔刷大小调节 上面的代码中其实我们已经提供了笔刷大小的字段,即brushSize,现在只需要将该字段和界面中的Slider绑定即可,Slider值的范围我们设置为1~20 代码中只需要做如下改动: public Slider brushSizeSlider; //控制笔刷大…

【hot100-java】【寻找两个正序数组的中位数】

二分查找篇 如果使用之前的两个指针分别遍历再合并的话就已经超过时间复杂度了。。 class Solution {public double findMedianSortedArrays(int[] nums1, int[] nums2) {int mnums1.length;int nnums2.length;if(m>n){return findMedianSortedArrays(nums2,nums1);}int tot…

Web3Auth 如何工作?

Web3Auth 用作钱包基础设施,为去中心化应用程序 (dApp) 和区块链钱包提供增强的灵活性和安全性。在本文档中,我们将探索 Web3Auth 的功能,展示它如何为每个用户和应用程序生成唯一的加密密钥提供程序。 高级架构 Web3Auth SDK 完全存在于用…

Cpp::STL—string类的模拟实现(12)

文章目录 前言一、string类各函数接口总览二、默认构造函数string(const char* str "");string(const string& str);传统拷贝写法现代拷贝写法 string& operator(const string& str);传统赋值构造现代赋值构造 ~string(); 三、迭代器相关函数begin &…

JS基础练习|动态创建多个input,并且支持删除功能

效果图 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>动态生成输入框并保存数据</title>&…

誉天Linux云计算课程学什么?为什么保障就业?

一个IT工程师相当于干了哪些职业? 其中置顶回答生动而形象地描绘道&#xff1a; 一个IT工程师宛如一个超级多面手&#xff0c;相当于——加班狂程序员测试工程师实施工程师网络工程师电工装卸工搬运工超人。 此中酸甜苦辣咸&#xff0c;相信很多小伙伴们都深有体会。除了典…

【微服务】注册中心 - Eureka(day3)

CAP理论 P是分区容错性。简单来说&#xff0c;分区容错性表示分布式服务中一个节点挂掉了&#xff0c;并不影响其他节点对外提供服务。也就是一台服务器出错了&#xff0c;仍然可以对外进行响应&#xff0c;不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述&…

uniapp修改uni-ui组件样式(对微信小程序/H5有效,vue3)

寻找要修改的样式 使用开发者工具找到具体要修改的class类名 修改 <style lang"scss">//.nav为上一级的class.nav::v-deep .uni-navbar--border {border-bottom-style: none !important;} </style>完整代码 <template><view><uni-na…

Kafka学习笔记(三)Kafka分区和副本机制、自定义分区、消费者指定分区

文章目录 前言7 分区和副本机制7.1 生产者分区写入策略7.1.1 轮询分区策略7.1.2 随机分区策略7.1.3 按key分区分配策略7.1.4 自定义分区策略7.1.4.1 实现Partitioner接口7.1.4.2 实现分区逻辑7.1.4.3 配置使用自定义分区器7.1.4.4 分区测试 7.2 消费者分区分配策略7.2.1 RangeA…

【华为HCIP实战课程三】动态路由OSPF的NBMA环境建立邻居及排错,网络工程师

一、NBMA环境下的OSPF邻居建立问题 上节我们介绍了NBMA环境下OSPF邻居建立需要手动指定邻居,因为NBMA环境是不支持广播/组播的 上一节AR1的配置: ospf 1 peer 10.1.1.4 //手动指定邻居的接口地址,而不是RID peer 10.1.1.5 area 0.0.0.0 手动指定OSPF邻居后抓包查看OSP…

C语言的内存结构

在电脑中C语言编译器也像其他软件一样占用一块内存空间。 为了更好的利用好这块内存&#xff0c;C语言将他们分为 在C语言中&#xff0c;变量定义的位置不一样&#xff0c;那么在内存中所处的位置也是不一样的。&#xff08;变量在函数内部是存储在栈里&#xff0c;而在函数外部…

SPI通信——FPGA学习笔记14

一、简介 SPI(Serial Periphera Interface&#xff0c;串行外围设备接口)通讯协议&#xff0c;是 Motorola 公司提出的一种同步串行接口技术&#xff0c;是一种高速、全双工、同步通信总线&#xff0c;在芯片中只占用四根管脚用来控制及数据传输&#xff0c;广泛用于 EEPROM、F…

基于STM32的智能家居灯光控制系统设计

引言 本项目将使用STM32微控制器实现一个智能家居灯光控制系统&#xff0c;能够通过按键、遥控器或无线模块远程控制家庭照明。该项目展示了如何结合STM32的外设功能&#xff0c;实现对灯光的智能化控制&#xff0c;提升家居生活的便利性和节能效果。 环境准备 1. 硬件设备 …

C--编译和链接见解

欢迎各位看官&#xff01;如果您觉得这篇文章对您有帮助的话 欢迎您分享给更多人哦 感谢大家的点赞收藏评论 感谢各位看官的支持&#xff01;&#xff01;&#xff01; 一&#xff1a;翻译环境和运行环境 在ANSIIC的任何一种实现中&#xff0c;存在两个不同的环境1&#xff0c;…

戴尔电脑怎么开启vt虚拟化_戴尔电脑新旧机型开启vt虚拟化教程

最近使用戴尔电脑的小伙伴们问我&#xff0c;戴尔电脑怎么开启vt虚拟。大多数可以在Bios中开启vt虚拟化技术&#xff0c;当CPU支持VT-x虚拟化技术&#xff0c;有些电脑会自动开启VT-x虚拟化技术功能。而大部分的电脑则需要在Bios Setup界面中&#xff0c;手动进行设置&#xff…

SpringCloud入门(九)Feign实战应用和性能优化

一、Feign实战应用 Feign的客户端与服务提供者的controller代码非常相似&#xff1a; 有没有一种办法简化这种重复的代码编写呢&#xff1f; 方式一&#xff1a;继承 优点&#xff1a; 简单。实现了代码共享。 缺点&#xff1a;服务提供方、服务消费方紧耦合。参数列表中的注解…

vscode安装及c++配置编译

1、VScode下载 VS Code官网下载地址&#xff1a;Visual Studio Code - Code Editing. Redefined。 2、安装中文插件 搜索chinese&#xff0c;点击install下载安装中文插件。 3、VS Code配置C/C开发环境 3.1、MinGW-w64下载 VS Code是一个高级的编辑器&#xff0c;只能用来写代…

Coggle数据科学 | Kaggle赛题解析:CMI 体育损伤指数预测

本文来源公众号“Coggle数据科学”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;Kaggle赛题解析&#xff1a;CMI 体育损伤指数预测 赛题名称&#xff1a;Child Mind Institute — Problematic Internet Use 赛题类型&#xff1a…