当前位置: 首页 > news >正文

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改

目录

前言

基本概念&理解

注意的点

查看环境变量的方法 

PATH环境变量 

PTAH应用系统指令 

PTAH应用用户程序

命令行参数的修改(内存级) 

配置文件的修改 

windows环境变量 


大家天天开心🙂

  • bash进程的流程。
  • 环境变量在系统指令和用户程序的应用。
  • 环境变量修改(命令行&配置文件的修改)理解。

前言

明确

  • Linux当中70%以上的命令程序都是用C语言写的
  • 执行命令程序和运行自己写的程序没有任何区别
  • 自己程序运行必须要带路径(绝对/相对都可)
  • 系统指令可带可不带(带不要瞎带)
  • 环境变量具有全局特性是可以被子进程看到的

  • 无论是全局变量还是局部变量,子进程的代码是继承父进程的,数据是拷贝的(子进程和父进程的数据是相互独立的)
  • 进程的独立性:父进程的数据是可以被子进程看到&访问(修改❌),子进程的数据是不能被父进程看到。
  • 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
  • 每开启一个终端就会有1个bash进程。
  • 一个用户也可以有多个bash进程。

回顾上篇博文

  • 登录Linux系统
  • 创建bash进程
  • 在命令行中输入参数
  • bash进程获取参数的路径&可执行程序
  1. 可执行程序是用户自己写(自己带路径)
  2. 可执行程序是系统指令(在bash进程的上下文环境变量中找)
  • 创建子进程
  • bash并把【命令行参数表】传给子进程main函数(传参)
  • 子进程接着执行自己的代码

产生这样一个问题:为什么我们自己的程序运行启动的时候需要带路径,但是系统的命令程序可带可不带路径❓

回答:在Linux当中,存在一些全局变量的设置(环境变量),告诉命令行解释器(bash进程),应该去那些路径底下去寻找这些可执行程序。

☞综下:ls不用带路径,因为ls所在的路径在环境变量当中。

 

基本概念&理解

概念&特性

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

整体理解

  • 登录Linux系统的时候,OS就把系统配置已经加载到了bash进程的上下文中(内存),系统配置就包括环境变量。
  • 当用户在命令行解释器中输入系统命令的时候,bash进程就拿到了命令行参数,根据环境变量,找到指令的可执行程序和路径,并创建指令的子进程。
  • (bash进程会根据$PATH在自己内存的上下文 配置信息中的 各种环境变量中找到对应的环境变量,并在此环境变量中找到对应的指令程序的路径和可执行程序)。

环境变量的作用
  • bash在执行命令的时候,需要先找到命令。因为要把命令所对应的二进制文件加载到内存中。
  • bash的上下文的环境变量中维护了一批指令的路径。
  • 默认这批指令的路径是bash创建子进程的搜索路径。
  1. 找到了就加载并运行
  2. 没找到就commend not fund
  • 注意❗:系统中有很多配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存中)
  • 注意❗:有部分指令程序&路径就在bash进程数据内部,不在环境变量PATH中,不受环境变量的影响。(后面讲)
  • 注意❗每个用户都一套的环境变量是从bash进程中拷贝的。修改A用户底下的环境变量并不会影响B用户底下的环境变量。

其中PATH就是一个典型的环境变量,☞PATH下面我们以PATH来讲解环境变量。

注意的点

  • 注意❗:系统中有很多配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存中)。
  • 注意❗:有部分指令程序&路径就在bash进程数据内部,不在环境变量PATH中,不受环境变量的影响。(后面讲)。
  • 注意❗每个用户都一套的环境变量是从bash进程中拷贝的。修改A用户底下的环境变量并不会影响B用户底下的环境变量。

关于在修改环境变量中:

  • 不维护在bash进程的配置文件中的环境变量中的指令路径,是不受环境变量修改的影响,随时可用。
  • 命令行中修改用户A的环境变量,是不会影响到A用户的bash进程/用户B进程/OS中的配置文件中的环境变量,只会影响当前用户当前进程。重启之后也不会影响,因为bash进程会重新读取。
  • 配置文件中修改用户A的环境变量,也不是会影响其他用户的bash进程/当前运行进程/OS中的其他用户的配置文件的环境变量,会影响当前用户的bash进程,正在运行进程和当前用户A中配置文件,重启也会影响。
  • 关键点:在重启,用户&用户,用户进程&用户进程。
  • 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
  • 每开启一个终端就会有1个bash进程。
  • 一个用户也可以有多个bash进程

 

查看环境变量的方法 

  1. Linux系统登录
  2. bash进程启动,OS把配置信息加载到bash进程上下文中
  3. 输入指令echo信息
  4. bash在环境变量中找到的指令程序的路径运行(echo的程序&路劲就在bash数据段内部,不在环境变量中)
  5. 创建echo指令的子进程
  6. bash把命令行参数给echo子进程,子进程执行
  • PATH中有很多路径,这些路径以冒号:为分隔符分割,划分了路径的区域。
echo $NAME //NAME:你的环境变量名称
echo $PATH //打印环境变量PATH的内容

PATH环境变量 

  • 如果我们执行我们的系统指令程序,在命令行中不需要输入指令,因为bash进程会到环境变量中找到指令的路径从而找到指令的可执行程序。
  • 如果我们执行用户程序,环境变量中没有维护,所以我们需要在命令行输入时带上路径,以便于bash进程找到可执行程序。

综下所述:PATH环境变量是Linux环境变量中搜索可执行程序的默认路径,也是which在PATH中的搜索路径。 

PTAH应用系统指令 

  • PATH环境变量是具有全局特性的。
  • PATH变量里面保存了指令的路径。
  • 系统中有很多配置,在我们登录Linux系统的时候,已经被加载到了bash进程中(内存中),其中包括环境变量PATH。
  • bash在执行命令的时候,需要先找到命令。因为要把命令所对应的二进制文件加载到内存中。
  • bash的上下文的环境变量中维护了一批指令的路径。
  • 默认这批指令的路径是bash创建子进程的搜索路径。
  1. 找到了就加载并运行
  2. 没找到就commend not fund

PTAH应用用户程序

❓关于我们的用户程序能否和系统指令一样呢。也不用带路径就可以运行。

修改PATH环境变量:

  • 命令行修改
  • 配置文件修改

关于命令行&配置文件修改的理解(关键在重启和不同的用户)

  • 每个用户启动都会有一个单独的bash进程,bash单独给这个用户形成命令行参数表和环境变量表。以及配置文件都是每个用户都有一份。互相独立,不影响。
  • 每开启一个终端就会有1个bash进程。
  • 一个用户也可以有多个bash进程。
  • 命令行中修改用户A的环境变量,是不会影响到A用户的bash进程/用户B进程/OS中的配置文件中的环境变量,只会影响当前用户当前进程。重启之后也不会影响,因为bash进程会重新读取。
  • 配置文件中修改用户A的环境变量,也不是会影响其他用户的bash进程/当前运行进程/OS中的其他用户的配置文件的环境变量,会影响当前用户的bash进程,正在运行进程和当前用户A中配置文件,重启也会影响。
  • 命令行解释器就是bash进程
  • 关键点:在重启,用户&用户,用户进程&用户进程。

 

命令行参数的修改(内存级) 

想要在运行用户程序的时候不在加上程序路径,有两种方法

  1. 拷贝用户的可执行程序到环境变量的指定路径底下
  2. 添加用户的可执行程序的路径到环境变量中

❗注意以下:操作都是内存级别的,默认我们查到的环境变量都是内存级。内存级别的修改只是暂时的,如果我们重启Linux操作系统,那么环境变量依旧是以前的没有修改的,又会把配置文件没有任何修改的重新加载到内存中。


【方法1】
  • 安装:sudo cp 用户程序  /usr/bin/    
  • 删除:sudo rm /usr/bin/a.out
  • 将用户程序安装到bash的环境变量中环境变量中的指定路径下。
  • 不建议拷贝用户程序到环境变量中,污染指令集。
  • 这些操作本质上都是在OS中安装卸载(内存级别)。在环境变量中指定路径下的拷贝和删除用户的可执行程序。

【方法2】

  • PARH=路径(路径会覆盖以前的全部路径)
  • PATH=以前的所有路径+新添加的路径
  • PATH=$PTAH:新添加的路径(简写)
  • 把指定路径添加到环境变量里,而不是直接让新路径把环境变量覆盖了。
  • 关于覆盖:有部分指令程序&路径就在bash进程数据内部,不在环境变量PATH中,不受环境变量的影响,即便覆盖也可以运行。

【方法1】

安装:sudo cp 用户程序  /usr/bin/    
删除:sudo rm /usr/bin/a.out


【方法2】

PARH=路径(路径会覆盖以前的全部路径)
PATH=以前的所有路径+新添加的路径
PATH=$PTAH:新添加的路径(简写)

配置文件的修改 

问题又出现了,想要让修改的内容永久有效怎么办?

  • 最开始的环境变量不是在内存中,而是在磁盘系统的对应的配置文件中。
  1. 登录Linux操作系统的时,磁盘中的配置文件会加载到内存的OS中。
  2. OS会创建一个bash进程。
  3. bash进程会读取内存中OS的配置文件。
  4. bash进程会把配置文件的环境变量拷贝一份到自己的进程数据中。
  • 每个进程使用的环境变量都是 bash/用户 内部的数据。(不同的用户使用的是自己/home/xxx的配置文件,每个用户都有一套)
  • 每次登录都要重新读取 bash/用户自己底下 配置文件。

如果想要修改的环境变量永久有效,那么就要修改 用户底下/bash 的配置文件中的环境变量,那么这些配置文件在哪里呢?

  • 每个用户(包括root)目录下 /home/xxxx 存在2个隐藏的配置文件
  •  .bash_profile 
  •  .bashrc
  • bash进程读取配置文件:文件操作fopen等(目前在命令行中查找环境变量都是内存级,存在bash的上下文中)
  • 修改配置文件中的环境:在.bash_profile里面加上可执行程序的路径即可
  • vim .bash_profile
  • 添加新的路径到.bash_profile旧的路径后面,以冒号:为分割
-rw-r--r--.  1 tangsiqi tangsiqi  193 Aug  2  2017 .bash_profile
-rw-r--r--.  1 tangsiqi tangsiqi  231 Aug  2  2017 .bashrc

【.bashrc】

.bashrc是home目录下的一个shell文件,用于储存用户的个性化设置。 在bash每次启动时都会加载.bashrc文件中的内容,并根据内容定制当前bash的配置和环境。 

vim .bashrc

【.bash_profile】 

bash_profile 只对单一用户有效,文件存储位于 ~/.bash_profile ,该文件是一个用户级的设置,可以理解为某一个用户的 profile 目录下。 这个文件同样也可以用于配置环境变量和启动程序,但只针对单个用户有效。 和 profile 文件类似,bash_profile 也会在用户登录(login)时生效,也可以用于设置环境变理。 

vim .bash_profile

windows环境变量 

  • cls是清屏&dir 是查看目录 
  • 系统的配置文件&用户的配置文件
  • windows底下也是有命令行解释器的cwd

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

相关文章:

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改

目录 前言 基本概念&理解 注意的点 查看环境变量的方法 PATH环境变量 PTAH应用系统指令 PTAH应用用户程序 命令行参数的修改(内存级) 配置文件的修改 windows环境变量 大家天天开心🙂 bash进程的流程。环境变量在系统指…...

5.7Python之元组

元组(Tuple)是Python中的一种数据类型,它是一个有序的、不可变的序列。元组使用圆括号 () 来表示,其中的元素可以是任意类型,并且可以包含重复的元素。 与列表(List)不同,元组是不可…...

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单视频处理实战案例 之一 简单视频放大抖动效果 一、简单介绍 二、简单视频放大抖动效果实现原理 三、简单视频放大…...

如何通过VPN访问内网?

VPN(Virtual Private Network)是一种通过公共网络建立私有网络连接的技术,可以在不同地点的网络中建立安全通道,实现远程访问内网资源的目的。本文将介绍如何通过VPN访问内网,并介绍一款名为“天联”的VPN服务。 什么是…...

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表

RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表 文章目录 RabbitMQ3.13.0起支持MQTT5.0协议及MQTT5.0特性功能列表1. MQTT概览2. MQTT 5.0 特性1. 特性概要2. Docker中安装RabbitMQ及启用MQTT5.0协议 3. MQTT 5.0 功能列表1. 消息过期1. 描述2. 举例3. 实现 2. 订阅标识…...

常用脚本01 - 生成证书

1 生成证书 第一步、准备脚本文件 [rootharbor-01 ssl]# vim gencert.sh #!/usr/bin/env bash set -eDOMAIN"$1" IP"$2" WORK_DIR"$(mktemp -d)"if [ -z "$DOMAIN" ]; thenecho "Domain name needed."exit 1 fiecho "…...

【jQuery】jQuery框架

目录 1.jQuery基本用法 1.1选择器 1.2jQuery对象 1.3事件绑定 1.4链式编程 1.5过滤方法 1.6样式操纵 1.6属性操纵 1.7操作value 1.8查找方法 1.9类名操纵 1.10事件进阶 1.11触发事件 1.12window事件绑定 2.节点操作与动画 2.1获取位置 2.2滚动距离 2.3显示/隐…...

使用OMP复原一维信号(MATLAB)

参考文献 https://github.com/aresmiki/CS-Recovery-Algorithms/tree/master MATLAB代码 %% 含有噪声 % minimize ||x||_1 % subject to: (||Ax-y||_2)^2<eps; % minimize : (||Ax-y||_2)^2lambda*||x||_1 % y传输中可能含噪 yyw % %% clc;clearvars; close all; %% 1.构…...

Linux安装最新版Docker完整教程

参考官网地址&#xff1a;Install Docker Engine on CentOS | Docker Docs 一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.6 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 …...

iOS object-c self关键字总结

在Objective-C中&#xff0c;self 关键字是一个指向当前对象的指针。它是对象自身实例的别名&#xff0c;通常在对象内部的方法中使用&#xff0c;以提供一个指向当前对象的引用。使用 self 可以帮助你访问对象的属性和方法&#xff0c;特别是在处理消息传递和方法调用时。 以…...

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年,35M带宽

京东云16核64G云服务器租用优惠价格500元1个月、5168元一年&#xff0c;35M带宽&#xff0c;配置为&#xff1a;16C64G-450G SSD系统盘-35M带宽-8000G月流量 华北-北京&#xff0c;京东云活动页面 yunfuwuqiba.com/go/jd 活动链接打开如下图&#xff1a; 京东云16核64G云服务器…...

hive管理之ctl方式

hive管理之ctl方式 hivehive --service clictl命令行的命令 #清屏 Ctrl L #或者 &#xff01; clear #查看数据仓库中的表 show tabls; #查看数据仓库中的内置函数 show functions;#查看表的结构 desc表名 #查看hdfs上的文件 dfs -ls 目录 #执行操作系统的命令 &#xff01;命令…...

cpp 内存分区模型

c程序在执行前&#xff0c;将内存大方向划分为4个区域。 1.代码区&#xff1a;存放函数的二进制代码&#xff0c;有操作系统进行管理 2.全局区&#xff1a;存放全局变量和静态变量以及常量 3.栈区&#xff1a;由编译器自动分配释放&#xff0c;存放的函数参数和局部变量 4.…...

44.网络游戏逆向分析与漏洞攻防-角色管理功能通信分析-角色创建服务器反馈数据包分析

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 如果看不懂、不知道现在做的什么&#xff0c;那就跟着做完看效果 现在的代码都是依据数据包来写的&#xff0c;如果看不懂代码&#xff0c;就说明没看懂数据包…...

web安全学习笔记(6)

记一下第十节课的内容。 一.PHP语言中的if else判断 语法和c语言中非常类似&#xff0c;不再赘述&#xff0c;也可以使用if...elseif...elseif...else 1.True和False 2.&#xff0c;和 一个等号是赋值 两个等号是比较 三个等号是全等&#xff08;内容相等&#xff0c;数…...

揭秘“二次放号查询接口”:为您的通信安全保驾护航

在信息化社会中&#xff0c;手机号码已成为我们日常生活中不可或缺的身份标识。然而&#xff0c;您是否了解过“二次放号”这一现象&#xff0c;以及它可能对您的信息安全带来的影响&#xff1f;今天&#xff0c;我们将为您揭开“二次放号查询接口”的神秘面纱&#xff0c;揭示…...

字节8年经验之谈 —— 如何实现高效的自动化渗透测试?

随着当前网络安全威胁的不断扩展与升级&#xff0c;开展渗透测试工作已经成为广大企业组织主动识别安全漏洞与潜在风险的关键过程。然而&#xff0c;传统的人工渗透测试模式对测试人员的专业能力和经验水平有很高的要求&#xff0c;企业需要投入较大的时间和资源才能完成。在此…...

ElasticSearch分词检索

1. 倒排索引&#xff1a;表示一种数据结构&#xff0c;分词词条与文档id集合的隐射关系 2. 它跟关系型数据库是一种互补的关系&#xff0c;因为关系型数据库支持事务操作&#xff0c;满足ACID原则 3. 索引库的文档字段只允许新增不允许修改 1.创建索引库 put /索引库名称2.1 …...

每日三道面试题之 Java并发编程 (四)

1.什么是线程死锁 线程死锁是并发编程中一个常见问题&#xff0c;它发生在两个或多个线程永久性地阻塞彼此&#xff0c;等待对方释放锁&#xff0c;但没有任何一方先行释放锁的情况下。简单来说&#xff0c;每个线程都持有对方需要的资源而等待对方释放资源&#xff0c;导致所…...

ubuntu20.04.6将虚拟机用户目录映射为磁盘Z

文章目录 linux虚拟机设置为NAT模式安装sshd服务映射目录到windows磁盘安装samba套件修改配置文件smb.conf重启smbd并设置用户名和密码 windows映射遇到的问题1、设置好之后映射不成功2、smbd下载失败3、smbd密码配置问题4、当有改动时候&#xff0c;最好重启一下smbd服务 linu…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...

Java后端检查空条件查询

通过抛出运行异常&#xff1a;throw new RuntimeException("请输入查询条件&#xff01;");BranchWarehouseServiceImpl.java // 查询试剂交易&#xff08;入库/出库&#xff09;记录Overridepublic List<BranchWarehouseTransactions> queryForReagent(Branch…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

网页端 js 读取发票里的二维码信息(图片和PDF格式)

起因 为了实现在报销流程中&#xff0c;发票不能重用的限制&#xff0c;发票上传后&#xff0c;希望能读出发票号&#xff0c;并记录发票号已用&#xff0c;下次不再可用于报销。 基于上面的需求&#xff0c;研究了OCR 的方式和读PDF的方式&#xff0c;实际是可行的&#xff…...

Copilot for Xcode (iOS的 AI辅助编程)

Copilot for Xcode 简介Copilot下载与安装 体验环境要求下载最新的安装包安装登录系统权限设置 AI辅助编程生成注释代码补全简单需求代码生成辅助编程行间代码生成注释联想 代码生成 总结 简介 尝试使用了Copilot&#xff0c;它能根据上下文补全代码&#xff0c;快速生成常用…...