【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/ls
file系统命令
发现也是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来认证。
环境变量在不同的应用场景被使用,我们需要在不同的场景使用不同的环境变量来做某些工作。
环境变量相关命令
- echo: 显示某个环境变量值
- export: 设置一个新的环境变量
- env: 显示所有环境变量
- unset: 清除环境变量
- 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,懂的都懂ÿ…...

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

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

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

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

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

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

详解结构体内存对齐
目录 前言 一、内存大小的计算 1.规则 2.练习 二、为什么要有内存对齐 1.移植原因 2.性能原因 三、修改默认对齐数 总结 前言 本文针对结构体大小的计算进行深度剖析。结构体的大小要遵守内存对齐,在绝大数情况下,会浪费空间。但是有其的价值&…...

指针:程序员的望远镜
指针:程序员的望远镜一、什么是指针1.1 指针的定义1.2 指针和普通变量的区别1.3 指针的作用1.4 指针的优点和缺点二、指针的基本操作2.1 取地址运算符"&"2.2 指针的声明与定义2.3 指针的初始化2.4 指针的解引用2.5 指针的赋值2.6 指针的运算2.7 指针的…...

【python实现学生选课系统】
一、要求: 选课系统 管理员: 创建老师:姓名、性别、年龄、资产 创建课程:课程名称、上课时间、课时费、关联老师 使用pickle保存在文件 学生: 学生:用户名、密码、性别、年龄、选课列表[]、上课记录{课程…...

备受青睐的4D毫米波成像雷达,何以助力高阶自动驾驶落地?
近日,海外媒体曝出特斯拉已向欧洲监管机构提交车辆变更申请,并猜测特斯拉最新的自动驾驶硬件HW4.0或将很快量产上车。据爆料,HW4.0最大的变化是马斯克放弃的毫米波雷达又加了回来,根据国外知名博主Greentheonly的拆解分析…...

3.20算法题(一) LeetCode 合并两个有序数组
题目链接:算法面试题汇总 - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 题目描述:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元…...

QT | 编写一个简单的上位机
QT | 编写一个简单的上位机 时间:2023-03-19 参考: 1.易懂 | 手把手教你编写你的第一个上位机 2.QT中修改窗口的标题和图标 3.图标下载 1.打开QT Creator 2.新建工程 Qt Creator 可以创建多种项目,在最左侧的列表框中单击“Application”&am…...

DirectX12(D3D12)基础教程(二十一)—— PBR:IBL 的数学原理(2/5)
目录3、IBL 数学原理3.1、基于微平面理论的 “Cook-Torrance” 模型回顾3.2、 ksk_sks 项与菲涅尔项等价消除3.3、拆分“漫反射项”和“镜面反射项”3、IBL 数学原理 接下来,就让我们正式进入整个 IBL 的数学原理的旅程。请注意,前方高能! …...

嵌入式学习笔记——SysTick(系统滴答)
系统滴答前言SysTick概述SysTick是个啥SysTick结构框图1. 时钟选择2.计数器部分3.中断部分工作一个计数周期(从重装载值减到0)的最大延时时间工作流程SysTick寄存器1.控制和状态寄存器SysTick->CTRL2.重装载值寄存器SysTick->LOAD3.当前值寄存器Sy…...

Linux实操之服务管理
文章目录一、服务(service)管理介绍:service管理指令查看服务名服务的运行级别(runlevel):CentOS7后运行级别说明chkconfig指令介绍一、服务(service)管理介绍: 服务(service)本质就是进程,但是是运行在后台的,通常都会监听某个端口,等待其它…...

基于Java+SpringBoot+vue的毕业生信息招聘平台设计和实现【源码+论文+演示视频+包运行成功】
博主介绍:专注于Java技术领域和毕业项目实战 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟 Java项目精品实战案例(200套) 目录 一、效果演示 二、…...