【环境变量】常见的环境变量 | 相关指令 | 环境变量系统程序的结合理解

目录

常见的环境变量

HOME

PWD

SHELL

HISTSIZE 

环境变量相关的指令

echo&env  

export 

unset

本地变量 

环境变量整体理解

程序现象_代码查看环境变量

整体理解

环境变量表

环境变量表的传递 

环境变量表的查看

测试验证


少说废话🆗

  • 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
  • 每开启一个终端就会有1个bash进程。
  • 一个用户也可以有多个bash进程。

常见的环境变量

  • PATH : 指定命令的搜索路径。
  • HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)。
  • SHELL : 当前Shell,它的值通常是/bin/bash。
  • 环境变量都是大写❗查看环境变量echo $PATH❗

☞我们再用echo看几个常见的环境变量吧,当然除了以下环境变量还有很多环境变量。

HOME

  • $HOME这个代码是一个环境变量,它代表的是当前登录的用户的主文件夹的意思。HOME家目录所在的环境变量。
  • 为什么初次登录的路径不一样❓因为账户不同,所以路径不一样。在登录时,系统配置给不同的用户设置在家目录下的不同账户下(路径就不一样)。
  • HOME就是用来维护每个用户的家目录路径的。

PWD

  • OS怎么知道此刻当前用户所处的路径。
  • OS中有一个会变化的环境变量,会随着用户操作路径的变量,动态的把当前路径记录在PWD的环境变量中。
  • pwd 是“打印工作目录”的缩写。 pwd 命令是 Linux 系统管理员最常用的命令之一。 它适用于 Linux 和其他类似 UNIX 的操作系统,是一个内置 shell 命令,可在 Bash shell、korn、ksh 等上使用。 pwd 命令打印当前工作目录名称以及从根 (/) 开始的完整路径。 它也是一个环境变量。

SHELL

  • Linux启动的时候,OS会为用户创建一个命令行shell媒婆(bash/sh、bash、csh、tcsh、ash实习生王婆/李婆....),为用户提供命令行参数解释的服务。
  • 用户怎么知道当前使用的是哪种shell呢
  • 所以,系统启动的时候,从SHELL的环境变量中把该程序运行起来(sh、bash、csh、tcsh、ash中的一个),产生了一个命令行解释器。 

HISTSIZE 

  • HISTSIZE = history+size(历史个数)
  • 我们在命令行解释器输入参数时,可以上下翻动查找我们的历史命令(搜索)
  • 证明我们曾经在命令行解释器输入的参数被LinuxOS记录下来了,但是我们输入的历史指令很多,不可能全部记录下来。
  • HISTSIZE默认记录用户输入最新的历史命令的大小
  • HISTSIZE值,用于控制history命令输出历史记录数量;HISTFILESIZE值,控制.bash_history文件中存储历史记录数量。
  • 注意❗HISTSIZE不一定是从1开始记录的。

  • history指令查看历史记录的所有指令
  • history | head
  • history | wc -l

 

环境变量相关的指令

  • 查看特点的环境变量 echo $环境变量❗
  • 查看全部的环境变量 env
  • echo: 显示某个环境变量值
  • export: 设置一个新的环境变量
  • env: 显示所有环境变量
  • unset: 清除环境变量,取消内存级自定义环境变量
  • set: 显示本地定义的shell变量和环境变量

系统当中用户所登录时的一些与登录相关/用户/路径程序相关的周边放在OS配置文件中的变量中,设置的全局变量,称为"环境变量"

echo&env  

echo $NAME
env

export 

export THIS_IS_MY_ENV=hellotsq
//注意=两边没有空格
//自己定义的一个输入自己的环境变量
//同理:这个只是在当前用户的环境变量中修改(内存级)
env | grep hellotsq
//查看

unset

[tangsiqi@localhost 7]$ unset THIS_IS_MY_ENV
[tangsiqi@localhost 7]$ env | grep hellotsq

本地变量 

  • 直接在命令行中定义的,不是环境变量,但还是在当前用户的bash内部。
  • 每个用户都有一个bash进程,bash里面就有配置文件,中有环境变量。
  • 不是环境变量env看不到,但是echo可以查看。

环境变量整体理解

程序现象_代码查看环境变量

  • 在上面,我们学习了用指令的方式 获取环境变量。
  • 当然,我们也可以用代码程序的方式获取环境变量。

前提知识:

  • 环境变量默认在bash内部。
  • 环境变量也是默认可以被子进程拿到的,拷贝父进程的。
  • 父进程的数据,默认能被子进程看到并访问(不能修改)
  • 在C语言标准库中,C语言会默认维护一个全局变量errno,用来统计最近一次调C语言函数的一个错误信息❌
  • 系统OS也会存在一个全局变量叫environ,类型是 char **二级指针。
  • 通过environ二级指针可以获取环境变量。
  • man errno 
  • man environ

程序代码解释:

  • environ[ i ]=*(environ+i)
  • 因为environ是一个全局的外部变量,所以切记使用前要用extern关键字进行声明,然后在使用。
  • unistd.h头文件中声明了这个变量,所以也可以将unist.h进行include,还是要声明。
  • *environ是指向环境变量字符串的首元素地址。

#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main()
{extern char** environ;for(int i=0;environ[i];i++){printf("env[%d]->%s\n",i,environ[i]);}return 0;
}

整体理解

环境变量表

  • 环境变量默认在bash内部。
  • 环境变量也是默认可以被子进程拿到的,拷贝父进程的。
  • 父进程的数据,默认能被子进程看到并访问(不能修改)。

❓环境变量是怎么组织的

  • 每个用户的bash在被OS启动的时候,bash都会为当前用户维护一张表,是指针数组
  • char *env[ ] 指针数组,里面的每个元素都是char *类型,指向一个环境变量字符串的起始地址。
  • "环境变量"字符串,把字符串的首地址放到指针数组中,形成了一张表,环境变量表。
  • 注意❗最后还是要以NULL结尾。
  • 所以,组织环境变量是用环境变量表组织的。
  • 所以,exprot的本质就是把自定义的环境变量导入环境变量表中。

❓bash运作的整个流程

  • LinuxOS启动bash启动
  • 当前用户下bash进程拿到命令行的参数,形成命令行参数表。
  • 拿到可执行程序的名字,到环境变量中去找路径和程序位置。(字符串匹配)
  • 根据程序所在路径,创建子进程。

综上所述:每个用户的bash启动的时候,都会默认给当前用户的子进程形成两张表。

  • 用户输入命令行:argv[ ]命令行参数表。
  • LinuxOS的配置文件中:env[ ]环境变量表。
  • bash通过各种方式把这两张表交给子进程。

 


【环境变量表】 

 【命令行参数表】

环境变量表的传递 

命令行参数表和环境变量表交给子进程有两种方式

  • 传参数
  • 子进程可以拷贝父进程的数据 

上面验证过了拷贝,这里验证下【传参】

#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main(int argc,char* argv[],char* env[])
{for(int i=0;env[i];i++){printf("env[%d]->%s\n",i,env[i]);}return 0;
}

环境变量表的查看

环境变量具有系统级的全局属性,因为环境变量本身会被子进程继承下去。上面学习了部分查看变量变量内容的方法。

  • 通过访问指针数组
  • env指令
  • echo指令
  • getenv函数接口

getenv

  • man getenv
  • 直接更具环境变量名拿到环境变量的内容、
  • getenv仅仅只是获取一个环境变量的内容
  • 还有putenv(后面自己实现bash会讲)

#include<stdio.h>
#include<string.h>
#include<unistd.h>
#include<stdlib.h>
int main(int argc,char *argv[],char *env[])
{char *path = getenv("PATH");if(path == NULL)return 1;printf("path:%s\n",path);return 0;
}

测试验证

🙂感谢大家的阅读,若有错误和不足,欢迎指正。

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

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

相关文章

K8S之Job和CronJob控制器

这里写目录标题 Job概念适用场景使用案例 CronJob概念适用场景使用案例 Job 概念 Job控制器用于管理Pod对象运行一次性任务&#xff0c;例如&#xff1a;对数据库备份&#xff0c;可以直接在k8s上启动一个mysqldump备份程序&#xff0c;也可以启动一个pod&#xff0c;这个pod…

Endnotes编辑参考文献的Style

Endnotes版本&#xff1a;X7 编辑过程&#xff1a; 1&#xff1a;打开软件&#xff0c;点击编辑—输出样式&#xff0c;可以在已有的style上编辑或则在建立新的样式。 我们选择numbered样式进行编辑。 2.我们先插入一个文献看看numbered的样式。关于下载endnotes的文件方法前…

“进击的巨人”:服务器硬件基础知识解析

引言&#xff1a; 服务器是网络环境中负责处理数据、运行应用程序和服务多用户的高性能计算机系统。了解服务器的硬件构成有助于更好地管理和优化IT资源。 服务器和普通PC的差异&#xff1a; 服务器具有比个人电脑更高的处理能力、稳定性和可靠性&#xff0c;它们通常运行在没…

B+树索引(如何设计、用好索引)

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时&#xff0c;都需要去修改各个B树索引。⽽且我们讲过&#xff0c;B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录&#xff0c;还是内节点中的记录&a…

Adobe InCopy 2024 v19.3 (macOS, Windows) - 编写和副本编辑软件

Adobe InCopy 2024 v19.3 (macOS, Windows) - 编写和副本编辑软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD…

星系炸弹(蓝桥杯真题填空题)

import java.time.LocalDate; import java.time.temporal.ChronoUnit; public class BombExplosionDate { public static void main(String[] args) { // 定义贝塔炸弹的放置日期和定时天数 LocalDate placementDate LocalDate.of(2014, 11, 9); int daysToExplode 10…

【已解决】ZIP压缩文件如何设置密码?

ZIP是常用的压缩格式之一&#xff0c;对于重要的ZIP文件&#xff0c;我们还可设置密码保护&#xff0c;那ZIP压缩文件怎么设置密码呢&#xff1f;不清楚的小伙伴一起来看看吧&#xff01; 给ZIP文件设置密码&#xff0c;我们需要用到支持ZIP格式的解压缩软件&#xff0c;比如7…

IDEA连接SqlServer数据库

目录 下载jar包 下载sqljdbc_12.6压缩包 解压 导入IDEA 新建文件夹 复制粘贴进JDBC文件夹并设为library 编写类及方法 代码 下载jar包 以sqljdbc_12.6为例 下载sqljdbc_12.6压缩包 最新地址&#xff1a;sqljdbc 官方最新地址 解压 解压即用 导入IDEA 新建文件夹 复制…

秋招刷题4(动态规划)

1.购物单 import java.util.Scanner;public class Main {public static void main(String[] args){Scanner sc new Scanner(System.in);int N sc.nextInt();int m sc.nextInt();Goods[] goods new Goods[m];for(int i 0; i < m; i){goods[i] new Goods();}for(int i …

Python爬虫-爬取药膳食谱数据

&#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;喜欢的话麻烦您点个&#x1f44d;和⭐&#xff01; &#x1f388;…

【STM32】存储器和位带映射(bit band mapping)

文章目录 0 前言1 关于地址和存储器2 STM32内部存储器3 位带映射&#xff08;bit band mapping&#xff09;4 扩展&#xff1a;IAP 0 前言 最近在研究stm32标准库&#xff0c;对使用宏定义实现位操作的函数非常感兴趣&#xff0c;简单的一句PAout(1) 0;就能实现某个引脚电平的…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…

InnoDB 数据页结构

1.行格式 1.1 Compact行格式 1.1.1 示意图 1.1.2 准备一下 1&#xff09;建表 mysql> CREATE TABLE record_format_demo (-> c1 VARCHAR(10),-> c2 VARCHAR(10) NOT NULL,-> c3 CHAR(10),-> c4 VARCHAR(10)-> ) CHARSETascii ROW_FORMATCOM…

ARM、X86、RISC-V三分天下

引入&#xff1a; 简单的介绍一下X86、ARM、RISC-V三种cpu架构的区别和应用场景。 目录 简单概念讲解 1. X86架构 2. ARM架构 3. RISC-V架构 应用场景 X86、ARM和RISC-V是三种不同的CPU架构&#xff0c;它们在设计理念、指令集和应用场景上有一些区别。 简单概念讲解 1. X…

力扣Lc29---- 541. 反转字符串 II(java版)-2024年4月06日

1.题目描述 2.知识点 &#xff08;1&#xff09;执行步骤如下&#xff1a; 初始化 s “abcdefg” 和 k 2 将字符串分割成长度为 2k 4 的块。 对每个块中的前 k 2 个字符进行反转。 执行过程 1&#xff09;第一次循环&#xff08;i 0&#xff09; start 0 end Math.min(0…

MPT - 初识账户状态树(World State)

往期回顾 ETH网络中的账户ETH网络中的区块链 通过以上文章&#xff0c;我们了解到ETH网络中的World State是节点根据交易维护的&#xff0c;节点在维护Wrold State时为了方便操作会将用户状态构建成一颗树&#xff0c;称为账户状态树&#xff0c;采用一种叫做MPT的数据结构 MP…

如何申请到免费SSL证书

免费SSL证书主要通过权威CA机构如Lets Encrypt、JoySSL等签发&#xff0c;具备基础的服务器身份验证功能&#xff0c;能有效防止中间人攻击&#xff0c;确保信息从用户的浏览器到服务器间的全程加密传输&#xff0c;保护用户隐私数据不被窃取或篡改。 尽管免费SSL证书可能存在有…

腾讯云添加域名后不生效

问题原因 添加域名后不生效可能是因为没有加CDN域名解析 解决步骤

ISWH卧式不锈钢管道离心泵

ISWH卧式不锈钢管道离心泵是一种设计精良的泵类产品&#xff0c;它采用先进的水力模型&#xff0c;结合高质量的不锈钢材料&#xff0c;确保了泵在输送流体时的高效率和长久耐用性。这种泵通常用于输送清水或其他类似于水的液体&#xff0c;特别是在需要避免腐蚀或污染的场合&a…

跨境金融区块链服务平台

跨境金融服务是因企业及个人跨境经营、交易、投资、往来等活动而产生的资金使用、调拨、配置等需求&#xff0c;而提供的金融服务。近年来&#xff0c;随着我国经济的快速稳步增长和全球化经济一体化的不断深入发展&#xff0c;跨境金融业务增长迅速&#xff0c;监管也开始转化…