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

【Linux】:环境变量

目录

前言(进程的特性):

1.认识环境变量

1.1 PATH

1.2 HOME

1.3 SHELL

1.4 HISSIZE

1.5 SSH_TTY 

1.6 PWD和OLPWD 

2. 环境变量的概念及其相关指令 

什么是环境变量

echo(输出字符串到终端)

env(查看环境变量)

set (查看所有环境变量和本地变量)

3.命令行参数

4.创建和取消环境变量

创建

取消 (unset)

5.获取环境变量(通过系统调用)

getenv

main()函数中的环境变量表 

通过第三方变量environ获取 

6.本地变量 


前言(进程的特性):

进程有四大特性:

竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级

独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰

并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行

并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发。 上下文 (计算机) - 维基百科,自由的百科全书 (wikipedia.org)

那么Linux系统是如何实现并发的呢?深入理解Linux内核进程上下文切换-腾讯云开发者社区-腾讯云 (tencent.com) 

1.认识环境变量

1.1 PATH

在Linux终端,我们输入指令,程序会直接运行指令对应的程序,但当我们编写好一个可执行程序时,执行它为什么要加上“ ./ ”呢?

或者这样说,为什么我们执行自己编写的可执行文件时要指定路径,而执行指令时则不用呢?本质上都是可执行文件。

因为当我们在命令行中输入指令后,系统会自动在PATH环境变量中,去进行查找。

查看环境变量PATH:

(以冒号为各个绝对路径的分隔符)

如果我们想执行“./mycmd”,只要在命令行中输入指令mycmd回车,可以把该条指令所在的绝对路径添加到环境变量PATH中,

就算重命名mycmd,执行重命名后的可执行文件也不用添加路径。 

如果我们一不小心将PATH中的所有路径都覆盖了,会怎么样呢? 大多数指令无法正常执行。我们现在重启Xshell,就会恢复原来的环境变量。因为我们修改的PATH是存在内存当中,修改内存中的PATH,并不会影响磁盘中PATH最初的配置。

1.2 HOME

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

1.3 SHELL

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

1.4 HISSIZE

记录历史指令的个数,与指令history的相关。

1.5 SSH_TTY 

左边和右边分别是两个终端, SSH_TY就代表终端设备文件(本质是个字符设备),我们向该文件输入字符串,字符串会自动显示到终端上。

1.6 PWD和OLPWD 

2. 环境变量的概念及其相关指令 

什么是环境变量

环境变量是系统提供的一组name=value形式的变量,不同的环境变量有不同的用户。

环境变量通常具有全局属性。环境变量_百度百科 (baidu.com)

echo(输出字符串到终端)

echo $NAME //NAME:需要查看环境变量的名称

env(查看环境变量)

查看所有环境变量。

set (查看所有环境变量和本地变量)

 set命令的功能是用于显示与设置Shell变量信息,管理员亦可以用该命令设置Shell终端特性,更好符合日常工作需要。
原文链接:set命令 – 显示与设置Shell变量信息 – Linux命令大全(手册)

3.命令行参数

当我们在命令行输入参数(各种指令)时,本质上是在输入单个字符串或多个字符串。

我们输入参数后,shell要对参数进行解析,如何解析呢?

我们编写一个可执行文件为例:

我们给main()函数两个参数,agrc表示字符串(数组元素)的个数,argv相当于参数包,是一个指针数组,数组的每个元素都是字符串指针。

当我们指向该源文件编译后的可执行程序时,shell会以空格为间隔,依次识别单个字符串。

同样的,我们输入一个命令,指令就相当于可执行程序,指令后的参数就相当于main函数中第二个参数。

 因为argv最后一个字符串为NULL,我们可以用for循环遍历所有参数。

通俗的说,命令行参数本质是为了支持用户选择不同的选项,以满足多功能需求。

注意:像char* argv[]这样的变量,我们称为向量表或环境表。

那么main函数只有一个向量表吗?并不是。

main函数中有两张核心向量表,一张是命令行参数表,另一张是环境变量参数表。我们已经验证了命令行参数表,现在我们来举例验证一下环境变量参数表。

我们编写好左边的源文件,并生成可执行程序,运行: 运行效果和env指令一样。这是为什么呢?

为什么这两个进程(env和./mycmd)的环境变量是一样的?

因为这两个进程都是同一个bash的子进程,子进程会继承父进程的环境变量。所有的子进程都会继承父进程的环境变量,这叫做环境变量的全局属性。

4.创建和取消环境变量

创建

同时,我们执行已经生成的可执行程序,

新建的环境变量MY_VALUE也被继承了。 

取消 (unset)

5.获取环境变量(通过系统调用)

getenv

我们用manual查看系统调用接口,

我们来测试一下getenv函数。

main()函数中的环境变量表 

 

通过第三方变量environ获取 

int main()
{extern char **environ;int i = 0;for(; environ[i]; i++){printf("%d: %s\n", i, environ[i]);}return 0;
}

6.本地变量 

本地变量只在当前bash内有效,不会被子进程继承。

我们export 本地变量,本地变量会变为环境变量。

用unset可以取消, 我们之前认为命令行中的所有进程都是bash的子进程,但这种说法不准确。

 我们先创建一个本地变量yls,然后用echo输出它,这两行指令创建了两个进程吗?并没有,echo是内建命令。cd命令可以通过系统调用接口chdir实现的。

内建命令是指bash内部实现的命令。bash在执行这些命令的时候不同于一般外部命令的fork、exec、wait的处理过程,这内建功能本身不需要打开一个子进程执行,而是bash本身就可以进行处理。分析外部命令的执行过程我们可以理解内建命令的重要性,外建命令都会打开一个子进程执行,所以有些功能没办法通过外建命令实现。比如当我们想改变当前bash进程的某些环境的时候,如:切换当前进程工作目录,如果打开一个子进程,切换之后将会改变子进程的工作目录,与当前bash没关系。所以内建命令基本都是从必须放在bash内部实现的命令。来源:SHELL编程之内建命令 | Zorro’s Linux Book (zorrozou.github.io)

linux命令分类大全 • Worktile社区

相关文章:

  • 收银机打印机相关知识 windows7 查看打印机名称--未来之窗智慧经营收银系统百科
  • Linux OS:线程封装 | RAII封装锁 | 随机数运算任务封装
  • 华为校招机试 - 电影知识图谱和查询系统(20240605)
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • 开发框架DevExpress XAF v24.2产品路线图预览——增强跨平台性
  • 医院不良事件监测预警上报系统,PHP不良事件管理系统源码
  • 认识MySQL
  • C++的GUI(图形用户界面)设计工具
  • LeetCode Hot100 二叉搜索树中第K小的元素
  • 探秘企业孵化基地,聚焦国际数字影像产业园
  • Spring有5种自动装配方式,其中autodetect默认使用?
  • 考研数学|《660》《880》怎么搭配使用
  • 【计算机网络】什么是socket编程?以及相关接口详解
  • Java线程池的这几个大坑,你踩过几个?
  • UE5 右键菜单缺少Generate Visual Studio project files
  • #Java异常处理
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • AHK 中 = 和 == 等比较运算符的用法
  • CentOS 7 修改主机名
  • co模块的前端实现
  • CSS 三角实现
  • FineReport中如何实现自动滚屏效果
  • gf框架之分页模块(五) - 自定义分页
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Python打包系统简单入门
  • quasar-framework cnodejs社区
  • Vue官网教程学习过程中值得记录的一些事情
  • 从重复到重用
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • scrapy中间件源码分析及常用中间件大全
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • #QT(智能家居界面-界面切换)
  • #单片机(TB6600驱动42步进电机)
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (8)STL算法之替换
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (正则)提取页面里的img标签
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)Linux下编译安装log4cxx
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .apk 成为历史!