【Linux】环境变量

环境变量

  • 一、引子
    • echo $NAME [NAME:环境变量名]
  • 二、基本概念
    • 概念
    • 常见的环境变量
      • PATH : 指定命令的搜索路径
      • 测试HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的家目录)
      • SHELL : 当前Shell,它的值通常是/bin/bash。
    • 和环境变量相关的命令
      • echo -- 显示某个环境变量值
      • export -- 设置(新增)一个新的环境变量
      • env -- 显示所有的环境变量
      • set -- 显示本地定义的shell变量和环境变量
      • unset -- 显示本地定义的shell变量和环境变量
      • 部分环境变量说明
      • 本地变量和内建命令
  • 三、环境变量的组织方式
  • 四、通过代码获取环境变量 -- 命令行参数表和环境变量表
    • argc和argv(命令行参数)
    • 第三个嫌疑参数 -- env && 第三方environ
    • getenv -- 获取环境变量的内容
  • 五、环境变量通常是具有全局属性的
    • 证明环境变量具有全局性 -- 利用export


一、引子

不知道大家有没有思考过当我们的程序编译链接成功后,需要./xxx让这个可执行程序跑起来,那为什么不能是xxx呢?

这是因为我们所写的命令、程序……都是文件,当我们执行自己的程序的时候,是需要./xxx来确定路径找到对应的程序,./就是告诉操作系统这个可执行程序就位于当前目录下。

在这里插入图片描述

而为什么我们在执行系统命令的时候是不需要带路径呢?就比如我们的ll、ls、mv等指令,直接用ls即可?

这是因为环境变量PATH的原因,系统通过环境变量PATH来找到ls命令的。也就是说ls命令就在PATH环境变量的默认路径下。环境变量的本质是操作系统在内存/磁盘文件中开辟的空间,用来保存系统相关的数据。

echo $NAME [NAME:环境变量名]

如下图所示,环境变量PATH以:为分割符,分割出多条路径,执行的时候从左往右依次查找,直到找到为止。
在这里插入图片描述
在这里插入图片描述

而我们的ls命令在usr/bin这个路径下,也就是这个系统命令实际就位于环境变量PATH中的某一路径下,所以就算不带路径,系统依靠环境变量PATH也是能够找到的。

而为什么我们不能直接运行自己的可执行程序呢?这是因为我们的可执行程序没有放到环境变量路径里面的路径!所以我们有以下两种方法:

No.1:把可执行程序拷贝在环境变量PATH的某一路径下,但因为会污染命令池。
也就是既然我们在没有指定路径的情况下系统会根据环境变量PATH当中的路径去查找,那我们就可以将我们的可执行程序拷贝到PATH的某一路径下,此后我们的可执行程序就不带路径系统也可以找到了!

sudo cp proc /usr/bin

No2、把我们的当前路径添加到环境变量PATH(可)
也就是简单暴力地将这个可执行程序所在的目录直接导入到环境变量PATH中,让PATH从左往右找路径,找到即可。

我们利用第二种方法来试一试:

export PATH=$PATH:当前路径

在这里插入图片描述

当然大家也不用担心这个环境变量加进去以后会一直占用,我们只需要重新登录一次我们的当前Linux账号环境变量就会恢复如初,因为这个修改环境变量仅仅是对此次登录有效,只要我们不动配置文件,不会出问题的。

二、基本概念

概念

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。是系统提供的一组name=value形式的变量,不同的环境变量有不同的属性,通常具有全局属性。

如:我们在编写C/C++代码的时候,在链接的时候,从来不知道我们的所链接的动态静态库在哪里,但是照样可以链接成功,生成可执行程序,原因就是有相关环境变量帮助编译器进行查找。

环境变量通常具有某些特殊用途,还有在系统当中通常具有全局特性

常见的环境变量

PATH : 指定命令的搜索路径

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

测试HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的家目录)

普通用户:
在这里插入图片描述
超级用户:
在这里插入图片描述

SHELL : 当前Shell,它的值通常是/bin/bash。

我们在Linux中所敲的各种命令,实际上是需要命令行解释器进行解释的,而在linux中有许多命令行解释器如bash、sh等,我们可以通过查看环境变量SHELL来知道自己当前所用的命令行解释类型。
在这里插入图片描述

其实命令行解释器实际上就是系统当中的一条命令,当这个命令运行起来变成进程后就可以为我们进行命令行解释。

在这里插入图片描述

和环境变量相关的命令

echo – 显示某个环境变量值

在这里插入图片描述

export – 设置(新增)一个新的环境变量

在这里插入图片描述

env – 显示所有的环境变量

在这里插入图片描述

set – 显示本地定义的shell变量和环境变量

在这里插入图片描述

unset – 显示本地定义的shell变量和环境变量

在这里插入图片描述

部分环境变量说明

在这里插入图片描述

本地变量和内建命令

本地变量不会被子进程继承,只在本bash内部有效。内建命令属于shell执行的一部分,因此执行内建命令不需要创建子进程,也不需要打开程序文件,这样不用操作文件IO,执行效率高,运行快。
MYVAL=100
echo $MYVAL
接下来有一个奇葩的现象,echo是bash的子进程没毛病,我们不是说本地变量MYVAL不会被子进程继承吗?我们的命令echo后面不是需要创建一个子进程吗?那么我们的echo $MYVAL需不需要创建一个子进程?为什么最终echo运行的时候把本地变量给打印出来了?

分类:两批命令:1、常规命令(通过创建子进程完成的) 2、内建命令(bash不创建子进程,而是由自己亲自执行的,类似于bash调用了自己写的或者是系统提供的函数)
所以在本bash中依靠内建命令即可完成echo的打印。

三、环境变量的组织方式

在这里插入图片描述

每个程序都会收到一张环境表,环境表是一个字符指针数组,每个指针指向一个以’\0’结尾的环境字符串

四、通过代码获取环境变量 – 命令行参数表和环境变量表

考察大家一个知识点,main函数中的()里面是有参数的吗?答案是有,而且有三个!我们先来讲解前两个,最后再讲解第三个!

argc和argv(命令行参数)

argc:命令行字符串的个数
argv:指针数组

这就是一个指针数组,argc自动计算指针数组的个数,而argv存着每一个指针,指向我们命令行中**以空格间隔的字符串。**即为指令、工具、软件等提供命令行选项的支持!
在这里插入图片描述

那么我们的命令行参数意义在哪里呢?
我们知道命令是带有很多选项的,完成一个命令的不同子功能。选项底层就是通过命令行参数实现的。也就是说,我们的ls -l这个指令是先ls再-l去找计算机内部的选项的,用来完成打印出详细信息的选项。

在这里插入图片描述
那我们就可以以这个为跳板来写一个小程序用以不同的功能:
在这里插入图片描述

第三个嫌疑参数 – env && 第三方environ

我们在第三章节的环境变量的组织方式中已经提到过环境变量的概念,所有的环境变量就是一个字符数组指针,指向不同的函数,来展示不同的功能。那么我们就能够用main函数中的第三个变量env来进行查看一下当前linux配置下的环境是怎么样的(刚好是单打env命令):
在这里插入图片描述

我们除了使用第三个函数变量envp后,还可以用第三方environ来看环境变量的。
注意:libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时 要用extern声明。
在这里插入图片描述
上面两种环境变量方式不常用,近乎不用,这里只是为了介绍环境变量的获取方式而已。

注意:我们所运行的进程都是子进程,bash本身在启动的时候,会从操作系统的配置文件中读取环境变量信息。

getenv – 获取环境变量的内容

这种方法用的很多,因为很好用,方便。
在这里插入图片描述
在这里插入图片描述

利用getenv()做一个查看权限的小程序:
在这里插入图片描述

五、环境变量通常是具有全局属性的

环境变量是从父进程继承得来,慢慢追溯到bash,甚至操作系统。

环境变量通常具有全局属性,可以被子进程继承下去。

在这里插入图片描述
可以看到PID一直在变,因为子进程在不断新建,但PPID保持不变,而它的父进程就是-bash,即命令行解释器。命令行上启动的进程,父进程都是bash。 操作系统都会记住子进程的!

证明环境变量具有全局性 – 利用export

本地变量 && 环境变量

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后执行命令是,打印出来环境变量,bash给我们创建子进程,./proc为子进程,也就证明了:

子进程继承了父进程的环境变量
子进程的环境变量是从父进程来的,追溯到bash

在这里插入图片描述


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

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

相关文章

[html]当网站搭建、维护的时候,你会放个什么界面?

效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>网站建设中</title><style>/* 基础样式 */body, html {margin: 0;padding: 0;height: 100%;font-family: Arial, sa…

Stable Diffusion stable-diffusion-webui ControlNet Lora

Stable Diffusion Stable Diffusion用来文字生成图片&#xff0c;ControlNet就是用来控制构图的&#xff0c;LoRA就是用来控制风格的 。 stable-diffusion-webui 国内加速官网&#xff1a; mirrors / AUTOMATIC1111 / stable-diffusion-webui GitCode 安装参考&#xff1a…

OpenCV(三十一):形态学操作

​​​​​​1.形态学操作 OpenCV 提供了丰富的函数来进行形态学操作&#xff0c;包括腐蚀、膨胀、开运算、闭运算等。下面介绍一些常用的 OpenCV 形态学操作函数&#xff1a; 腐蚀操作&#xff08;Erosion&#xff09;&#xff1a; erode(src, dst, kernel, anchor, iteration…

Wireshark技巧[监听串口包]

监听串口包 本文摘录于&#xff1a;https://blog.csdn.net/qq_20405005/article/details/79652927只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 这里要保证安装了USBpcap: 打开USBpcap后一半都要输入过滤条件,否则USB太多数据了,比如…

PHP实现微信小程序状态检测(违规、暂停服务、维护中、正在修复)

实现原理 进入那些状态不正常的小程序会被重定向至一个Url&#xff0c;使用抓包软件抓取这个Url&#xff0c;剔除不必要参数&#xff0c;使用cURl函数请求网页获得HTML内容&#xff0c;根据内容解析出当前APPID的小程序的状态。 代码 <?php// 编码header(Content-type:ap…

正弦信号的平均功率和峰值电压计算举例

正弦信号的平均功率和峰值电压计算举例 一、问题 假设加载在纯电阻为R1Ω&#xff0c;频率为50Hz和60Hz的正弦信号的平均功率分别为0.5W和2W,请求解这两个信号的峰值电压 U p 1 U_{p1} Up1​和 U p 2 U_{p2} Up2​。 二、解答&#xff1a; 根据欧姆定律可知&#xff1a;对于…

docker镜像 容器 仓库

docker镜像 Docker 运行容器前需要本地存在对应的镜像&#xff0c;如果本地不存在该镜像&#xff0c;Docker会从镜像仓库下载该镜像。 获取镜像 Docker Hub 上有大量的高质量的镜像可以用&#xff0c;这里我们就说一下怎么获取这些镜像。 从 Docker 镜像仓库获取镜像的命令…

2023-9-8 求组合数(三)

题目链接&#xff1a;求组合数 IV #include <iostream> #include <algorithm>using namespace std;const int N 5010;int primes[N], cnt; bool st[N]; // 每个质数的次数 int sum[N];void get_primes(int n) {for(int i 2; i < n; i){if(!st[i]) primes[cnt]…

为什么vector容器的begin()既可以被iterator 也可以被const_iterator指向?

答&#xff1a;vector容器中的begin&#xff08;&#xff09;是函数接口&#xff0c;它作为函数&#xff0c;被重载了。 typedef T* iterator; typedef const T* const_iterator; iterator begin();//括号中有隐含形参*this&#xff1b; const_iterator begin() const;//形参为…

UDP的可靠性传输2

系列文章目录 第一章 UDP的可靠性传输-理论篇&#xff08;一&#xff09; 第二章 UDP的可靠性传输-理论篇&#xff08;二&#xff09; 文章目录 系列文章目录三、流量控制RTORTT流量控制1.如何控制流量2. 发送方何时在发送数据3.流程图 拥塞控制1.慢启动 总结1.拥塞控制和流量…

React基础

目录 TODO1 React概述 React的使用 React脚手架的使用 全局安装 npx安装 在脚手架中使用React JSX 1. JSX的基本使用 1.1 为什么用JSX 1.2 JSX简介 1.3 使用步骤 1.4 脚手架中能用JSX 1.5 注意点 2. 在JSX中使用JavaScript表达式 2.1 嵌入js表达式 2.2 注意点 3…

三.listview或tableviw显示

一.使用qt creator 转变类型 变形为listview或tableviw 二.导出ui文件为py文件 # from123.py 为导出 py文件 form.ui 为 qt creator创造的 ui 文件 pyuic5 -o x:\xxx\from123.py form.uifrom123.py listview # -*- coding: utf-8 -*-# Form implementation generated fro…

linux编辑器-vim

1.vim是什么 vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。简单的来说&#xff0c; vi 是老式的字处理器&#xff0c;不过功能已经很齐全了&#xff0c;但是还是有可以进步的地方。 vim 则可以…

虹科分享 | MKA:基于先进车载网络安全解决方案的密钥协议

MKA作为MACsec的密钥协议&#xff0c;具有安全、高效、针对性强的特点&#xff0c;为您的汽车ECU通讯创建了一个安全的通信平台&#xff0c;可以助力您的各种汽车创新项目&#xff01; 虹科方案 | 什么是基于MACsec的汽车MKA 一、MACsec在汽车行业的应用 在以往的文章中&#…

云原生Kubernetes:pod基础

目录 一、理论 1.pod 2.pod容器分类 3.镜像拉取策略&#xff08;image PullPolicy&#xff09; 二、实验 1.Pod容器的分类 2.镜像拉取策略 三、问题 1.apiVersion 报错 2.pod v1版本资源未注册 3.取行显示指定pod信息 四、总结 一、理论 1.pod (1) 概念 Pod是ku…

《智能网联汽车自动驾驶功能测试规程》

一、 编制背景 2018 年4 月12 日&#xff0c;工业和信息化部、公安部、交通运输部联合发布《智能网联汽车道路测试管理规范(试行)》&#xff08;以下简称《管理规范》&#xff09;&#xff0c;对智能网联汽车道路测试申请、审核、管理以及测试主体、测试驾驶人和测试车辆要求等…

Vue.js 中的路由(Route)跳转

Vue.js 中的路由 官方解释 在 Vue.js 中&#xff0c;路由是一种用于导航和页面跳转的重要概念。Vue 提供了一个名为 Vue Router 的官方插件&#xff0c;用于构建单页面应用程序&#xff08;SPA&#xff09;的路由系统。Vue Router 允许您将不同的组件映射到应用程序的不同 URL…

分享5个和安全相关的 VSCode 插件

开发高质量的软件应用程序可能是艰巨的&#xff0c;因为许多组成部分必须协同工作才能创建出一个可运行的解决方案。这就是为什么开发人员需要尽可能获得所有帮助和便利&#xff0c;特别是在保护他们的应用程序时。 Visual Studio Code&#xff08;VSCode&#xff09;是最受欢迎…

eNSP-抓包实验

拓扑结构图&#xff1a; 实验需求&#xff1a; 1. 按照图中的设备名称&#xff0c;配置各设备名称 2. 按照图中的IP地址规划&#xff0c;配置IP地址 3. 使用Wireshark工具进行抓ping包&#xff0c;并分析报文 4. 理解TCP三次握手的建立机制 实验步骤&#xff1a; 1、配置P…

Python之Xlwings操作excel

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、xlwings简介二、安装与使用1.安装2.使用3.xlwings结构说明 二、xlwings对App常见的操作App基础操作工作簿的基础操作工作表的基础操作工作表其他操作 读取单元格…