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

【Linux】环境变量(基本概念 常见环境变量 测试PATH 环境变量相关命令)

文章目录

  • 环境变量
    • 基本概念
    • 常见环境变量
    • 测试PATH
    • 别的环境变量
    • 通过系统调用获取或设置环境变量
    • 环境变量相关命令
      • export: 设置一个新的环境变量
      • set: 显示本地定义的shell变量和环境变量
      • unset: 清除环境变量
    • 通过代码如何获取环境变量


环境变量

基本概念

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

常见环境变量

PATH : 指定命令的搜索路径
HOME : 指定用户的主工作目录(即用户登陆到Linux系统中时,默认的目录)
SHELL : 当前Shell,它的值通常是/bin/bash。

测试PATH

在这里插入图片描述
在这里插入图片描述
这个myprocess程序可以被理解成命令,
我们file myprocess发现:
在这里插入图片描述
当前我们自己写的myprocess,它就是一个executable表示的是一个可执行程序。

继续输入:file /usr/bin/lsfile系统命令
在这里插入图片描述
发现也是64位下的可执行程序。

我写的可执行程序和系统里的可执行程序都是可执行程序。
为什么在执行指令的时候不用带./路径,而运行myprocess要带./路径?
因为我们要执行一个程序前提是先找到这个程序(指令),我们在运行程序的时候输入./myprocess,这个./叫做当前路径即可以帮我们找到程序。当我们程序运行指令ls的时候直接就能跑的原因是系统帮我们默认找了。

如果我们想运行我们的程序但是不带任何的路径,那么可以sudo cp myprocess /usr/bin/把myprocess拷贝到usr/bin对应的路径下,也就是把我们的程序拷贝到系统安装指令的路径当中。接下里运行就可以了:
在这里插入图片描述
但是不建议这么干,因为我们写的代码没有经过测试,尽量不要安装进去,会污染指令池的。

为什么我们cp指令过去系统就能找到呢?原因是系统中存在环境变量,path环境变量:操作系统在启动的时候会在shell上下文中定义的一个path变量,这个在系统全局有效。无法直接查看,必须加$

在这里插入图片描述
所以我们系统在执行指令时,会默认在每一个冒号作为间隔的每一条路径当中去帮我们检索,去搜索对应的指令,如果指令存在的话就找到并执行。搜索完所有的路径后发现指令不存在就报错。

我们系统中的指令可以执行是因为系统的指令是在user/bin这个路径下,能被系统找到,我们现在想让我们自己的指令执行的时候可以不带./,我们可以这样操作:
将当前的路径加到环境变量当中这是一种属于内存级的环境变量。

在这里插入图片描述
然后我们再去执行就不用./了。
在这里插入图片描述
which指令在底层实现的时候,就是根据环境变量PATH,来进行路径搜索帮我们找要执行的指令。所以which可以查自己的指令也可以查系统的指令。

bath 是可以定义变量的,$a 这个a的变量值便有了。
在这里插入图片描述

在windows下同样存在环境变量,
在这里插入图片描述
windows操作系统内部也有自己的变量的值,所以我们在配置Java等的时候可能要该path,添加一些东西。


cd ~,进入当前用户的工作目录,
在这里插入图片描述
然后ls -al,在我的家目录下存在两个文件,一个是.bash_profile一个是.bashrc,

在这里插入图片描述
我们打开.bash_profile:
在这里插入图片描述
发现它做的是倒环境变量。同样我们打开bashrc
它会检查系统的bashrc这个文件是否存在,如果存在也会倒环境变量,
在这里插入图片描述

然后我们可以vim /etc/bashrc打开系统的bashrc,它里面有很多的动作,就是在帮我们构建环境变量。我们就明白了一个道理:我们的shell在我们自己登录的时候,系统会默认让我们当前的shell进程把对应的.bash_profile里面的内容执行一次,也就是把对应的环境变量倒到我们当前的shell当中,那么环境变量的配置就是通过.bash_profile在启动的时候被加载倒bash当中,所以我们自己一旦启动成功后,在内存中会给我们维护一个变量叫作:$path(内存级的),即使被覆盖掉也没关系,下次重新登陆时bath会重新去读取配置文件,把环境变量倒回来,这种变量是由操作系统为我们提供的,是具有全局属性的,往往具备特殊功能的变量,我们称为环境变量

别的环境变量

除了path之外还有别的环境变量:

echo $ hone:表示的是当前用户自己的工作目录。
在这里插入图片描述

ehco $ HOSTNAME:表示的是主机名。
在这里插入图片描述

echo $LOGNANME:当前登录系统的用户是谁。。

echo $HISTSIZE:系统可以记忆历史命令的最大值。
在这里插入图片描述
如果我们想查看系统中所有的环境变量,用env就可以了看到所有的环境变量:

在这里插入图片描述

环境变量本质就是数据,甚至可以把它当成字符串。
环境变量就是操作系统为了满足不同的应用场景而预先在系统内设置的一大批的全局变量,这些变量在我们整个系统当中,从bash往后一直都会被其他进程访问到。


通过系统调用获取或设置环境变量

在这里插入图片描述

在这里插入图片描述

如果我们将来想通过指令的方式获取环境变量,我们可以env,打印出系统当中我们自己用户当中所有环境变量信息。

在这里插入图片描述

可以echo $PATH打印指定确定的环境变量内容。

想通过指令的方式去获取可以getenv

在这里插入图片描述

接下来我们自己去调一下:

在这里插入图片描述

编译运行,
在这里插入图片描述

也就是说我们自己写的代码它认识我们了,在root用户下它同样认识。

这件事情的意义在于:USER 环境变量最大的意义,可以标识当前的使用Linux用户,让我们知道当前是以谁的身份在运行Linux。
下面我们再修改代码:判断who如果等于root就执行打印动作,否则就输出“权限不足”。

在这里插入图片描述
运行程序:
在这里插入图片描述

然后我们切换root用户,并进入我们写的程序文件中,

在这里插入图片描述

在这里插入图片描述

再次运行程序:

在这里插入图片描述

Linux会筛选用户,并告诉用户不能做什么工作,有时候一个文件的属性也能获取,所以系统编写指令的时候,指令的内部做了一大堆的身份认证,身份认证就相当于它可以通过对应的文件属性获取。

所以我们的系统级指令会做权限和身份认证,身份认证有一个重要的环就是通过user来认证

环境变量在不同的应用场景被使用,我们需要在不同的场景使用不同的环境变量来做某些工作。

环境变量相关命令

  1. echo: 显示某个环境变量值
  2. export: 设置一个新的环境变量
  3. env: 显示所有环境变量
  4. unset: 清除环境变量
  5. set: 显示本地定义的shell变量和环境变量

我们可以自己设置一些环境变量:

在这里插入图片描述
下面试着理解环境变量的全局性和本地变量:

我们先获取自定义环境变量,
在这里插入图片描述

然后编译运行,
在这里插入图片描述
因为我们刚定义的不是环境变量,所以myval时not found。

export: 设置一个新的环境变量

export它可以对环境变量作定义,并且如果一个本地变量已经存在,想把它倒成环境变量只需要:
export myval

在这里插入图片描述

当我们在命令行运行./mycmd的时候,bash就是一个系统进程,mycmd也会变成一个进程(fork),mycmd是我们自己写的代码,它是bash的子进程。

环境变量具有全局属性根本原因是:会被子进程全部继承下去。

继承下去的原因是:为了不同的应用场景,让bash帮我们找指令路径,身份认证。有些子进程会用到 这些信息来作为自己代码逻辑的一部分,好比我们前面获取通过获取user环境变量来对我们用户作身份认证,未来可能我们通过获取其他环境变量来确认当前对应用户的信息。

环境变量是属于系统变量中的全局变量,具有全局性,本地变量就只会在当前进程(bash)内有效

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

我们定义一个变量 yourval=4321
在这里插入图片描述

set命令打印出来的东西很多,有环境变量、PS…
在这里插入图片描述

unset: 清除环境变量

在这里插入图片描述

在这里插入图片描述

通过代码如何获取环境变量

我们了解到,环境变量被子进程继承下去,但是是怎么继承的呢?如何做的?

输入下面代码:我们知道main函数是系统调用的。

在这里插入图片描述

在这里插入图片描述
运行后我们发现指针数组的0下标指向./mycmd
我们继续:
在这里插入图片描述
我们发现当我们在命令的内容不断变多时,数组的内容会自动变多

其实所谓的命令行参数本质是依次要把程序名和选项传递给argv。

我们输的命令行操作是一个大的字符串,我们在进行命令行解析的时候,如下:
在这里插入图片描述

把在命令行输入的字符以空格为单位拆成一个一个的子字符串,

在这里插入图片描述

argc代表的是命令行中一共有多少个子字符串,argv是一张表,是一张映射表,它是一个指针数组,会指向一个一个的字串。

这个东西对我们的意义是什么:
在这里插入图片描述

假如我们想做一个./mycmd -a -b -c这样的一个程序,我们想让-a -b -c分别有不同的操作,同样的可执行程序,我们想让带不同的选项做不同的动作:
在这里插入图片描述

在这里插入图片描述

编译运行他就告诉我们如何用,
在这里插入图片描述我们就选择一个:./mycmd -a
在这里插入图片描述
剩下的都是一样的,此时我们就可以通过不同的命令行参数,用不同的选项,让同样的程序,来使用这个程序内部不同的功能,这就是命令行参数最大的意义。

下面我们继续:

在这里插入图片描述

上面这两张表被我们进程拿到,进程就可以使用这里的环境变量了,所以环境变量是可以被其他进程拿到的。具体证明是NULL结尾如下:
在这里插入图片描述

补充完代码后编译运行:此时我们就拿到了系统传的环境变量。
在这里插入图片描述
我们自己导一个环境变量export myval=4444,再次运行就能看到,我们自己导进去的环境变量。
在这里插入图片描述
在这里插入图片描述

这个环境变量是导给shell的,我们运行程序的时候需要创建子进程,并且还要把shell的环境变量交给子进程。(通过命令行参数)

相关文章:

【Linux】环境变量(基本概念 常见环境变量 测试PATH 环境变量相关命令)

文章目录环境变量基本概念常见环境变量测试PATH别的环境变量通过系统调用获取或设置环境变量环境变量相关命令export: 设置一个新的环境变量set: 显示本地定义的shell变量和环境变量unset: 清除环境变量通过代码如何获取环境变量环境变量 基本概念 环境变量(environment vari…...

安全牛+瑞数信息:《数据安全管控平台应用指南》报告共同发布

随着《中华人民共和国网络安全法》《中华人民共和国数据安全法》《中华人民共和国个人信息保护法》和《关键信息基础设施安全保护条例》“三法一条例”的陆续发布,从国家、社会与个人已经逐步形成了加强数据安全保护的态势。 2023年1月中旬,工业和信息化…...

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(6)

目录 写在前面: 题目:P1683 入门 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述: 输入格式: 输出格式: 输入样例: 输出样例: 解题思路: 代码: AC &a…...

论文解读TCPN

一、简要介绍视觉信息提取(VIE)近年来受到了越来越多的关注。现有的方法通常首先将光学字符识别(OCR)结果组织成纯文本,然后利用标记级实体注释作为监督来训练序列标记模型。但是,它花费大量的注释成本&…...

性能优化之防抖与节流

(一)防抖 (1)定义:单位事件内,频繁触发,只执行最后一次(像王者荣耀的回城操作) (2)使用场景:搜索输入框、手机号邮箱输入检测 &…...

数组模拟单链表

实现一个单链表,链表初始为空,支持三种操作: 向链表头插入一个数; 删除第 k个插入的数后面的数; 在第 k个插入的数后插入一个数。 现在要对该链表进行 M次操作,进行完所有操作后,从头到尾输出整…...

蓝桥杯刷题第十四天

第二题:不同子串题目描述本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如,字符串aaab 有非空子串 a, b, aa, ab, aaa, aa…...

面试了8家软件公司测试岗位,面试题大盘点,我真的尽力了

包含的模块:本文分为十九个模块,分别是:软件测试 基础、liunx、MySQL、web测试、接口测试、APP测试 、管理工具、Python、性能测试、selenium、lordrunner、计算机网络、组成原理、数据结构与算法、逻辑题、人力资源需要的可以看文末获取方式…...

Activiti 工作流简介

1、什么是工作流 工作流(Workflow),就是通过计算机对业务流程自动化执行管理。它主要解决的是“使在多个参与者之间按照某种预定义的规则自动进行传递文档、信息或任务的过程,从而实现某个预期的业务目标,或者促使此目标的实现”。 1.2、工作…...

【华为机试真题详解 Python实现】统计差异值大于相似值二元组个数【2023 Q1 | 100分】

文章目录 前言题目描述输入描述输出描述题目解析参考代码前言 《华为机试真题详解》专栏含牛客网华为专栏、华为面经试题、华为OD机试真题。 如果您在准备华为的面试,期间有想了解的可以私信我,我会尽可能帮您解答,也可以给您一些建议! 本文解法非最优解(即非性能最优)…...

【C++】Google编码风格学习

Google规范线上地址:https://zh-google-styleguide.readthedocs.io/en/latest/ 文章目录1. 头文件2. 作用域3. 类4. 函数5. 其他C特性6. 命名约定7. 注释8. 格式1. 头文件 每个cpp/cc文件都对应一个h头文件,除单元测试代码和只包含main()的文件外。 所…...

JavaScript 中的Promise 函数

JavaScript 中的Promise 函数 目录JavaScript 中的Promise 函数1 创建Promise2 Promise的方法3 Promises的状态4 Promise的使用5 返回 Promise 类型6 Promise级联使用在现在的前端开发中我们常常会使用到 JavaScript Promise 函数,但是很多人都不能正确理解Promise …...

学校教的Python,找工作没企业要,太崩溃了【大四真实求职经历】

如果只靠学校学的东西去找工作,能找到工作吗? 今天给大家看一个粉丝的真实求职案例,想做Python方面的工作,投了二十几个简历却没人要,心态崩了。为什么没人要?我来告诉你答案。 然后我还会结合我的这些年的…...

快看!这只猫两次登上 Github Trending !!!

前几天我在逛 Github Trending,无意间发现这个Postcat 登上榜单 !好奇心驱使我去了解这个 Postcat。近期它上新了几个有意思的插件,其中 ChatGPT 插件,用户可以直接省去复杂的流程,直接体验 ChatGPT,懂的都懂&#xff…...

Linux->文件系统初识

目录 前言: 1 认识文件 2 文件使用 2.1 文件加载 2.2 外设文件使用 3 文件接口和文件描述符 3.1 文件系统调用接口 open: 3.2 文件描述符 4 缓冲区 前言: 在大家看这篇文章之前,我得提出几个问题: 1. 我们有多…...

InfluxDB和IotDB介绍与性能对比

InfluxDB简介 InfluxDB 是用Go语言编写的一个开源分布式时序、事件和指标数据库,无需外部依赖。用于存储和分析时间序列数据的开源数据库。 适合存储设备性能、日志、物联网传感器等带时间戳的数据,其设计目标是实现分布式和水平伸缩扩展。 InfluxDB 包括用于存储和…...

计算机体系结构(校验码+总线)

校验码计算机系统运行时,为了确保数据在传送过程中正确无误,一是提高硬件电路的可靠性;二就是是提高代码的校验能力,包括查错和纠错。通常使用校验码的方法检测传送的数据是否出错。这里的校验码主要是指循环冗余校验码&#xff0…...

JavaWeb《三》Request请求转发与Response响应

🍎道阻且长,行则将至。🍓 本文是javaweb的第三篇,介绍了Request请求转发与Response响应。 上一篇:JavaWeb《二》Servlet、Request请求 下一篇:敬请期待 目录一、Request请求转发🍏二、Response对…...

断言assert

assert作用&#xff1a;我们使用assert这个宏来调试代码语法&#xff1a;assert&#xff08;bool表达式&#xff09;如果表达式为false&#xff0c;会调用std::cout<<abort函数&#xff0c;弹出对话框&#xff0c;#include<iostream> #include<cassert> void…...

【Java项目】完善基于Java+MySQL+Tomcat+maven+Servlet的博客系统

目录一、准备工作二、引入依赖三、创建必要的目录四、编写代码五/六、打包部署(直接基于 smart tomcat)七、验证代码正式编写服务器代码编写数据库相关的操作代码创建数据库/表结构(数据库设计)数据库代码封装数据库操作封装针对数据的增删改查&#xff01;博客列表页约定前后端…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...