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

news/2024/7/24 13:46:29/

文章目录

  • 环境变量
    • 基本概念
    • 常见环境变量
    • 测试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的环境变量交给子进程。(通过命令行参数)


http://www.ppmy.cn/news/33722.html

相关文章

ThreadPool线程池源码解析

ThreadPool线程池源码解析 文章目录前言一、基本使用二、执行流程三、源码分析ThreadPoolExecutor 中重要属性ThreadPoolExecutor 内部类Workerexecute()方法addWorker(command, true)方法runWorker(worker )方法getTask()方法shutdown和shutdownNow四、…

Java栈和队列·下

Java栈和队列下2. 队列(Queue)2.1 概念2.2 实现2.3 相似方法的区别2.4 循环队列3. 双端队列 (Deque)3.1 概念4.java中的栈和队列5. 栈和队列面试题大家好,我是晓星航。今天为大家带来的是 Java栈和队列下 的讲解!😀 继上一个讲完的栈后&…

1.9 日本蜡烛图技术之支撑和压力的其他含义

破低反涨和破高反跌形态 支撑和压力的研究不能局限于涨跌幅边界研究,用K线图来验证会注意到很多突破来临的信号破低反涨形态 一种移动和反向移动,价格跌破支撑,然后反弹重新上涨通常建立新的支撑线 破高反跌形态:突破压力后&…

hadoop理论基础(一)

1.hadoop的组成2 HDFS概述HDFS(Hadoop Distributed File System)是一个分布式文件系统(1)NameNode:存储文件的元数据;如文件名、文件目录结构、文件属性,以及每个文件的块列表和块所在的DataNode等。(2)DataNode:在本地…

【测试开发篇4】测试模型

目录 一、软件测试V模型 编码前 概要设计: 详细设计: 编码后: 单元测试&集成测试 系统测试 验收测试 V模型的特点 优点: 缺点: 二、软件测试W模型 编码之前: 编码的时候: 编…

Three.js——learn01

Three.js——learn01Three.js——learn01本地搭建文档通过parcel搭建Threejs环境1.初始化2.安装parcel设置打包位置3.设置目录结构QuickStart安装threejsindex.htmlindex.cssindex.js启动Three.js——learn01 本地搭建文档 登录GitHub搜索three.js git clone https://github…

KubeSphere All in one安装配置手册

KubeSphere All in one安装配置手册 1. 初始化 1.1 配置apt源 # vi /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiversedeb…

【多线程】多线程案例

✨个人主页:bit me👇 ✨当前专栏:Java EE初阶👇 ✨每日一语:we can not judge the value of a moment until it becomes a memory. 目 录🍝一. 单例模式🍤1. 饿汉模式实现🦪2. 懒汉模…

redhat httpd服务安装、访问浏览器及自定义访问页面

目录 1.查看本地仓库,如果没有配置,就在这目录创建一个 2.挂载 3.下载httpd服务 4.修改httpd配置文件 5.重启httpd服务 6.查看当前可用IP地址 7.随便用一个IP 看是否有东西 8.无法访问,原因是我们防火墙没有放行httpd服务 1.查看本地仓库&a…

Cookie和Session详解

目录 前言: Session详解 Cookie和Session区别和关联 服务器组织会话的方式 使用Tomcat实现登录成功跳转到欢迎页面 登录前端页面 登录成功后端服务器 重定向到欢迎页面 抓包分析交互过程 小结: 前言: Cookie之前博客有介绍过&#x…

HJ1 字符串最后一个单词的长度(JAVA)

目录 题目: 描述 输入描述: 输出描述: 示例1 解题思路: 总代码: 题目: 描述 计算字符串最后一个单词的长度,单词以空格隔开,字符串长度小于5000。(注&#xff1a…

error: C1083: 无法打开包括文件: “QtGui/QApplication”: No such file or directory

Qt系列文章目录 文章目录Qt系列文章目录前言一、原因二、解决办法1.修改pro工程文件2.在main.cpp中三、总结前言 当我们从网上或者从打开别人的工程师,报错,C1083: 无法打开包括文件: “QtGui/QApplication”。 原因:Qt5里不再用QtGui模块&a…

动态规划算法

一、前言动态规划是一种常用的算法,在算法领域十分重要,但对于新手来说,理解起来有一定的挑战性,这篇博客将明确步骤来一步一步讲解动态规划到底该如何理解与运用。二、解析动态规划算法1.特点①把原来的问题分解成了【要点相同】…

vue使用split()将字符串分割数组join()将数组转字符串reverse()将数组反转

1.split() 将字符串切割成数组 const str Hello Vue2 Vue3 console.log(str.split()) console.log(str.split()) console.log(str.split( )) console.log(str.split( , 2)) console.log(str.split( , 6))输出如下 1.split()不传参数默认整个字符串作为数组的一个元素&#xf…

Java Web 实战 15 - 计算机网络之网络编程套接字

文章目录一 . 网络编程中的基本概念1.1 网络编程1.2 客户端(client) / 服务器(server)1.3 请求(request) / 响应(response)1.4 客户端和服务器之间的交互数据1.4.1 一问一答1.4.2 多问一答1.4.3 一问多答1.4.4 多问多答二 . socket 套接字2.1 UDP 的 Socket API2.1.1 引子2.1.2…

嵌入式硬件电路设计的基本技巧

目录 1 分模块 2 标注关键参数 3 电阻/电容/电感/磁珠的注释 4 可维修性 5 BOM表归一化 6 电源和地的符号 7 测试点 8 网络标号 9 容错性/兼容性 10 NC、NF 11 版本变更 12 悬空引脚 13 可扩展性 14 防呆 15 信号的流向 16 PCB走线建议 17 不使用\表示取反 不…

web测试技术

一、Web 测试与传统测试的区别 相同之处 测试内容: 功能、性能、易用性、兼容性、安全性等 测试方法: 等价类边界值法、判定表法、状态迁移法,流程分析法、因果图法、错误猜测法等 测试手段: 人工测试、工具测试等不同之处 Web 测…

C++造轮子飙车现场之无锁、有锁环形队列实现

先看带锁的实现。 带锁版本 circular_queue.h // 头文件防卫 #ifndef CIRCULAR_QUEUE_H #define CIRCULAR_QUEUE_H#include <mutex> // 互斥量 #include <condition_variable> // 条件变量template <typename T> class CircularQueue { public:// 构造函数…

docker安装overleaf并升级texlive

20230321 0. 引言 之前在虚拟机安装了overleaf&#xff0c;应该是两年前的事情了&#xff0c;本来是想尝试一下overleaf更新了什么功能&#xff0c;但是没想到浪费了这么多时间。当时安装的还是2.5的版本&#xff0c;现在已经是3.5了。 在这个过程中&#xff0c;有几个地方需…

脱不下孔乙己的长衫,现代的年轻人该怎么办?

“如果我没读过书&#xff0c;我还可以做别的工作&#xff0c;可我偏偏读过书” “学历本该是我的敲门砖&#xff0c;却成了我脱不下的长衫。” 最近&#xff0c;“脱下孔乙己的长衫”在网上火了。在鲁迅的原著小说中&#xff0c;孔乙己属于知识阶级&#xff08;长衫客&#xf…