Shell运行环境之环境变量
liuian 2024-11-28 00:51 86 浏览
在 Windows 系统中,我们经常需要设置环境变量,特别是安装完 Java JDK 之后。而在 Linux 里面也是需要对一些环境变量进行设置,比如 PATH (执行文件的路径),http_proxy(http 代理)等。本文主要介绍三种环境变量--临时变量,用户变量和系统变量,并对其作用的先后做一些验证。
简介
环境变量[1]一般是指在操作系统中用来指定操作系统运行环境的一些参数,如:临时文件夹位置和系统文件夹位置等。它相当于给系统或用户应用程序设置的一些参数,具体起什么作用这和具体的环境变量相关。
在 Windows 系统里面,经常会遇到设置环境变量[2]的问题,特别是安装完 Java JDK 之后。我们很少在黑漆漆的命令行窗口中执行命令set path=%path%;D:\jdk\bin,因为这样设置的变量是临时环境变量,它只能在这个命令窗口中被识别,知道 java 命令在 D:\jdk\bin 目录里,但当重新打开一个命令窗口(Shell 外壳)后新窗口将无法识别。也就是说该 PATH 只对执行那个命令的 Shell 有效。还有两种方法是设置用户变量或系统变量。二者的区别就在于系统变量对所有用户有效,而用户变量只对当前用户有效。经试验,win8系统中二者都无需重启就可以起作用。
Linux 环境变量设置
其实,linux里面对环境变量的设置和windows是共通的。它也有三种方式
?临时变量
在 Shell 外壳中执行命令PATH=$PATH':/home/hjy/program/jdk/bin',同样 Java 命令只能在当前窗口中识别,重开一个外壳 java 命令将无效。
?用户变量
Linux 里面关于用户变量的设置是在两个文件中,一个是 /etc/profile,另一个是 ~/.profile。profile 是配置的意思,是某个用户唯一用来设置环境变量的地方。针对不同的用户习惯,使用不同的 Shell(像bash,sh,zsh等),针对不同的功能或不同的应用,加载不同的环境变量文件。
?系统变量
Linux 里面关于系统变量的设置是在 /etc/environment 文件中。该环境变量的设置不需要加 export,直接赋值即可。
验证作用域
易知临时变量的作用域只在当前的终端中,出了当前终端将失效。而对于用户变量和系统变量,我们这里做两个小的试验,其中一个是网上[3]的,关键是讲解中又是疑问又是否定的,没搞明白作者啥意思,所以这里亲自验证一下。
图形界面登录
经试验发现,自己的电脑环境和网上博主还是有些区别的。主要在本地化语言环境设定上的区别[4],在安装好中文和英文的语言包后,系统的本地语言环境如图:
但是由这篇博文--locale的设定中LANG、LC_ALL、LANGUAGE环境变量的区别[5]知道,LC_ALL > LC_* >LANG,所以在本机上配置 LANG 将会被 LC_* 所取代,而导致无论怎么设置都是英文环境。所以实际实验是设定 LC_ALL 变量。
?试验步骤
1.将 export LC_ALL=zh_CN.UTF-8 加入 /etc/profile,退出系统重新登录,登录界面和 locale 变量如下图所示:
2.删除 /etc/profile 中的 export LC_ALL=zh_CN.UTF-8,并将其加入到 /etc/envirionment,退出系统重新登录,登录界面和locale变量如下图所示:
?结论: 在登录界面时(还没有用户登录系统),系统执行了 /etc/environment,仅此而已。而对于是否执行 /etc/profile 以及这两个文件谁先谁后的问题无法得出结论。对于这个问题,后面会做一下讨论。
结论: 用户登录系统前,即刚进入登录界面,此时 /etc/environment 已经被执行。
用户登录后进入shell后
?试验步骤
1.在/etc/profile文件中加入如下变量:
export eprofile='I am in /etc/profile'
export epro_env='I am in /etc/profile'
export epro_pro='I am in /etc/profile'
2.在/etc/environment文件中加入如下变量:
environment='I am in /etc/environment'
epro_env='I am in /etc/environment'
env_pro='I am in /etc/environment'
3.在~/.profile文件中加入如下变量:
export profile='I am in ~/.profile'
export epro_pro='I am in ~/.profile'
export env_pro='I am in ~/.profile'
4.重启系统后查看 profile, environment, homepro, pro_env, pro_env_pro这五个变量的值,结果如下图所示:
?结论:
1.三个环境配置文件都被执行了
变量 environment, eprofile, profile 都有值
2./etc/environment 优先于 /etc/profile
变量 epro_env 是 /etc/profile 里面的值,结合第一个结论,可得 /etc/environment 优先于 /etc/profile
3./etc/profile 优先于 ~/.profile
变量 epro_pro 是 ~/.profile 里面的值,结合第一个结论,可得 /etc/profile 优先于 ~/.profile
结论: 用户登录系统打开shell后,/etc/environment,/etc/profile和~/.profile执行顺序是: /etc/environment => /etc/profile => ~/.profile
问题讨论
- 关于第一个试验中只能得出 /etc/environment 在登录界面前将被执行,而对于是否执行 /etc/profile 以及这两个文件谁先谁后的问题无法得出结论。
- 从两幅登录界面发现在 /etc/environment 设定的 LC_ALL 起作用了,但是 /etc/profile 中的不起作用可能是被后面的覆盖掉,也有可能该文件还没有被执行,至于后面 locale 变量的比较,是在我们登录进系统后打开 Shell 后看到的。所以无法判定在登录界面之前/etc/profile是否被执行,更不谈谁先谁后。
- 个人倾向的解释是登录界面之前只是执行 /etc/environment,不会执行 /etc/profile,当输入用户和密码后才会以登录模式进入系统,此时 /etc/profile 和 ~/.profile 才会被执行。
参考文献
1.环境变量定义[6]
2.如何设置或更改PATH系统变量[7]
3.etc/profile和/etc/environment的比较[8]
4.本地化环境变量LANG、LC_ALL、LANGUAGE的区别[9]
5.wiki locale[10]
References
[1] 环境变量: http://baike.baidu.com/link?url=3Gg85PddfEhNPdztYJ_eXTlskslQrMUiD3rgR707cgNQtc9TEQhNksaqD-pX-kd0s2xN4nSS4Y6_CVynCguHLK
[2] 设置环境变量: https://www.java.com/zh_CN/download/help/path.xml
[3] 网上: http://andy136566.iteye.com/blog/1025338
[4] 本地化语言环境设定上的区别: http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale
[5] locale的设定中LANG、LC_ALL、LANGUAGE环境变量的区别: http://my.oschina.net/luan/blog/79875
[6] 环境变量定义: http://baike.baidu.com/link?url=3Gg85PddfEhNPdztYJ_eXTlskslQrMUiD3rgR707cgNQtc9TEQhNksaqD-pX-kd0s2xN4nSS4Y6_CVynCguHLK
[7] 如何设置或更改PATH系统变量: https://www.java.com/zh_CN/download/help/path.xml
[8] etc/profile和/etc/environment的比较: http://andy136566.iteye.com/blog/1025338
[9] 本地化环境变量LANG、LC_ALL、LANGUAGE的区别: http://my.oschina.net/luan/blog/79875
[10] wiki locale: http://wiki.ubuntu.org.cn/%E4%BF%AE%E6%94%B9locale
如果该文章对您产生了帮助,或者您对技术文章感兴趣,可以关注微信公众号: 技术茶话会, 能够第一时间收到相关的技术文章,谢谢!
相关推荐
- 深入解析 MySQL 8.0 JSON 相关函数:解锁数据存储的无限可能
-
引言在现代应用程序中,数据的存储和处理变得愈发复杂多样。MySQL8.0引入了丰富的JSON相关函数,为我们提供了更灵活的数据存储和检索方式。本文将深入探讨MySQL8.0中的JSON...
- MySQL的Json类型个人用法详解(mysql json类型对应java什么类型)
-
前言虽然MySQL很早就添加了Json类型,但是在业务开发过程中还是很少设计带这种类型的表。少不代表没有,当真正要对Json类型进行特定查询,修改,插入和优化等操作时,却感觉一下子想不起那些函数怎么使...
- MySQL的json查询之json_array(mysql json_search)
-
json_array顾名思义就是创建一个数组,实际的用法,我目前没有想到很好的使用场景。使用官方的例子说明一下吧。例一selectjson_array(1,2,3,4);json_array虽然单独...
- 头条创作挑战赛#一、LSTM 原理 长短期记忆网络
-
#头条创作挑战赛#一、LSTM原理长短期记忆网络(LongShort-TermMemory,LSTM)是一种特殊类型的循环神经网络(RNN),旨在解决传统RNN在处理长序列数据时面临的梯度...
- TensorBoard最全使用教程:看这篇就够了
-
机器学习通常涉及在训练期间可视化和度量模型的性能。有许多工具可用于此任务。在本文中,我们将重点介绍TensorFlow的开源工具套件,称为TensorBoard,虽然他是TensorFlow...
- 图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
-
本文约4600字,建议阅读10分钟本文介绍了图神经网络版本的对比。KolmogorovArnoldNetworks(KAN)最近作为MLP的替代而流行起来,KANs使用Kolmogorov-Ar...
- kornia,一个实用的 Python 库!(python kkb_tools)
-
大家好,今天为大家分享一个实用的Python库-kornia。Github地址:https://github.com/kornia/kornia/Kornia是一个基于PyTorch的开源计算...
- 图像分割掩码标注转YOLO多边形标注
-
Ultralytics团队付出了巨大的努力,使创建自定义YOLO模型变得非常容易。但是,处理大型数据集仍然很痛苦。训练yolo分割模型需要数据集具有其特定格式,这可能与你从大型数据集中获得的...
- [python] 向量检索库Faiss使用指北
-
Faiss是一个由facebook开发以用于高效相似性搜索和密集向量聚类的库。它能够在任意大小的向量集中进行搜索。它还包含用于评估和参数调整的支持代码。Faiss是用C++编写的,带有Python的完...
- 如何把未量化的 70B 大模型加载到笔记本电脑上运行?
-
并行运行70B大模型我们已经看到,量化已经成为在低端GPU(比如Colab、Kaggle等)上加载大型语言模型(LLMs)的最常见方法了,但这会降低准确性并增加幻觉现象。那如果你和你的朋友们...
- ncnn+PPYOLOv2首次结合!全网最详细代码解读来了
-
编辑:好困LRS【新智元导读】今天给大家安利一个宝藏仓库miemiedetection,该仓库集合了PPYOLO、PPYOLOv2、PPYOLOE三个算法pytorch实现三合一,其中的PPYOL...
- 人工智能——图像识别(人工智能图像识别流程)
-
概述图像识别(ImageRecognition)是计算机视觉的核心任务之一,旨在通过算法让计算机理解图像内容,包括分类(识别物体类别)、检测(定位并识别多个物体)、分割(像素级识别)等,常见的应用场...
- PyTorch 深度学习实战(15):Twin Delayed DDPG (TD3) 算法
-
在上一篇文章中,我们介绍了DeepDeterministicPolicyGradient(DDPG)算法,并使用它解决了Pendulum问题。本文将深入探讨TwinDelayed...
- 大模型中常用的注意力机制GQA详解以及Pytorch代码实现
-
分组查询注意力(GroupedQueryAttention)是一种在大型语言模型中的多查询注意力(MQA)和多头注意力(MHA)之间进行插值的方法,它的目标是在保持MQA速度的同时...
- pytorch如何快速创建具有特殊意思的tensor张量?
-
专栏推荐正文我们通过值可以看到torch.empty并没有进行初始化创建tensor并进行随机初始化操作,常用rand/rand_like,randint正态分布(0,1)指定正态分布的均值还有方差i...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
python使用fitz模块提取pdf中的图片
-
《人人译客》如何规划你的移动电商网站(2)
-
Jupyterhub安装教程 jupyter怎么安装包
-
- 最近发表
-
- 深入解析 MySQL 8.0 JSON 相关函数:解锁数据存储的无限可能
- MySQL的Json类型个人用法详解(mysql json类型对应java什么类型)
- MySQL的json查询之json_array(mysql json_search)
- 头条创作挑战赛#一、LSTM 原理 长短期记忆网络
- TensorBoard最全使用教程:看这篇就够了
- 图神经网络版本的Kolmogorov Arnold(KAN)代码实现和效果对比
- kornia,一个实用的 Python 库!(python kkb_tools)
- 图像分割掩码标注转YOLO多边形标注
- [python] 向量检索库Faiss使用指北
- 如何把未量化的 70B 大模型加载到笔记本电脑上运行?
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- react-admin (33)
- vscode切换git分支 (35)
- vscode美化代码 (33)
- python bytes转16进制 (35)