百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Shell运行环境之环境变量

liuian 2024-11-28 00:51 82 浏览

在 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

问题讨论

  1. 关于第一个试验中只能得出 /etc/environment 在登录界面前将被执行,而对于是否执行 /etc/profile 以及这两个文件谁先谁后的问题无法得出结论。
  2. 从两幅登录界面发现在 /etc/environment 设定的 LC_ALL 起作用了,但是 /etc/profile 中的不起作用可能是被后面的覆盖掉,也有可能该文件还没有被执行,至于后面 locale 变量的比较,是在我们登录进系统后打开 Shell 后看到的。所以无法判定在登录界面之前/etc/profile是否被执行,更不谈谁先谁后。
  3. 个人倾向的解释是登录界面之前只是执行 /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



如果该文章对您产生了帮助,或者您对技术文章感兴趣,可以关注微信公众号: 技术茶话会, 能够第一时间收到相关的技术文章,谢谢!

相关推荐

GANs为何引爆机器学习?这篇基于TensorFlow的实例教程为你解惑!

「机器人圈导览」:生成对抗网络无疑是机器学习领域近三年来最火爆的研究领域,相关论文层出不求,各种领域的应用层出不穷。那么,GAN到底如何实践?本文编译自Medium,该文作者以一朵玫瑰花为例,详细阐...

高丽大学等机构联合发布StarGAN:可自定义表情和面部特征

原文来源:arXiv、GitHub作者:YunjeyChoi、MinjeChoi、MunyoungKim、Jung-WooHa、SungKim、JaegulChoo「雷克世界」编译:嗯~...

TensorFlow和PyTorch相继发布最新版,有何变化

原文来源:GitHub「机器人圈」编译:嗯~阿童木呀、多啦A亮Tensorflow主要特征和改进在Tensorflow库中添加封装评估量。所添加的评估量列表如下:1.深度神经网络分类器(DNNCl...

「2022 年」崔庆才 Python3 爬虫教程 - 深度学习识别滑动验证码缺口

上一节我们使用OpenCV识别了图形验证码躯壳欧。这时候就有朋友可能会说了,现在深度学习不是对图像识别很准吗?那深度学习可以用在识别滑动验证码缺口位置吗?当然也是可以的,本节我们就来了解下使用深度...

20K star!搞定 LLM 微调的开源利器

LLM(大语言模型)微调一直都是老大难问题,不仅因为微调需要大量的计算资源,而且微调的方法也很多,要去尝试每种方法的效果,需要安装大量的第三方库和依赖,甚至要接入一些框架,可能在还没开始微调就已经因为...

大模型DeepSeek本地部署后如何进行自定义调整?

1.理解模型架构a)查看深度求索官方文档或提供的源代码文件,了解模型的结构、输入输出格式以及支持的功能。模型是否为预训练权重?如果是,可以在预训练的基础上进行微调(Fine-tuning)。是否需要...

因配置不当,约5000个AI模型与数据集在公网暴露

除了可访问机器学习模型外,暴露的数据还可能包括训练数据集、超参数,甚至是用于构建模型的原始数据。前情回顾·人工智能安全动态向ChatGPT植入恶意“长期记忆”,持续窃取用户输入数据多模态大语言模型的致...

基于pytorch的深度学习人员重识别

基于pytorch的深度学习人员重识别Torchreid是一个库。基于pytorch的深度学习人员重识别。特点:支持多GPU训练支持图像的人员重识别与视频的人员重识别端到端的训练与评估简单的re...

DeepSeek本地部署:轻松训练你的AI模型

引言:为什么选择本地部署?在AI技术飞速发展的今天,越来越多的企业和个人希望将AI技术应用于实际场景中。然而,对于一些对数据隐私和计算资源有特殊需求的用户来说,云端部署可能并不是最佳选择。此时,本地部...

谷歌今天又开源了,这次是Sketch-RNN

前不久,谷歌公布了一项最新技术,可以教机器画画。今天,谷歌开源了代码。在我们研究其代码之前,首先先按要求设置Magenta环境。(https://github.com/tensorflow/magen...

Tensorflow 使用预训练模型训练的完整流程

前面已经介绍了深度学习框架Tensorflow的图像的标注和训练数据的准备工作,本文介绍一下使用预训练模型完成训练并导出训练的模型。1.选择预训练模型1.1下载预训练模型首先需要在Tensorf...

30天大模型调优学习计划(30分钟训练大模型)

30天大模型调优学习计划,结合Unsloth和Lora进行大模型微调,掌握大模型基础知识和调优方法,熟练应用。第1周:基础入门目标:了解大模型基础并熟悉Unsloth等工具的基本使用。Day1:大模...

python爬取喜马拉雅音频,json参数解析

一.抓包分析json,获取加密方式1.抓包获取音频界面f12打开抓包工具,播放一个(非vip)视频,点击“媒体”单击打开可以复制URL,发现就是我们要的音频。复制“CKwRIJEEXn-cABa0Tg...

五、JSONPath使用(Python)(json数据python)

1.安装方法pipinstalljsonpath2.jsonpath与Xpath下面表格是jsonpath语法与Xpath的完整概述和比较。Xpathjsonpath概述/$根节点.@当前节点...

Python网络爬虫的时候json=就是让你少写个json.dumps()

大家好,我是皮皮。一、前言前几天在Python白银交流群【空翼】问了一个Python网络爬虫的问题,提问截图如下:登录请求地址是这个:二、实现过程这里【甯同学】给了一个提示,如下所示:估计很多小伙伴和...