Linux环境变量详解

Linux环境变量详解

环境变量是操作系统环境设置的变量,适用于整个系统的用户进程。

环境变量分类

按照权限分类

  • 系统级:系统级的环境变量是每个登录到系统的用户都要读取的系统变量
  • 用户级:用户级的环境变量则是该用户使用系统时加载的环境变量

按照生存周期分类

  • 永久的:需要修改配置文件,变量永久生效
  • 临时的:使用export命令声明即可,变量在关闭shell时失效

Linux环境变量文件

环境变量文件简介

linux变量文件有/etc/environment/etc/profile~/.profile/etc/bash.bashrc~/.bashrc, 以及~/.bash_profile~/.bash_logout.

注意在每台机器中,这些配置文件并不是全都有,其中有些是必须的,有些是几个里面有一个,具体的介绍请往下看。

系统级

  1. /etc/environment:是系统在登录时读取的第一个文件,该文件设置的是整个系统的环境,只要启动系统就会读取该文件,用于为所有进程设置环境变量。系统使用此文件时并不是执行此文件中的命令,而是根据而是根据KEY=VALUE模式的代码,对KEY赋值以VALUE,因此文件中如果要定义PATH环境变量,只需加入一行形如 PATH=$PATH:/xxx/bin的代码即可

  2. /etc/profile:此文件是系统登录时执行的第二个文件。 为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。并从/etc/profile.d目录的配置文件中搜集shell的设置。(/etc/profile可以用于设定针对全系统所有用户的环境变量,环境变量周期是永久性)

  3. /etc/bashrc:是针对所有用户的bash初始化文件,在此中设定的环境变量将应用于所有用户的shell中,此文件会在用户每次打开shell时执行一次。(即每次新开一个终端,都会执行/etc/bashrc)。

用户级

(这些文件处于主目录下)

  1. ~/.profile:对应当前登录用户的profile文件,用于定制当前用户的个人工作环境(变量是永久性),每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。这里是推荐放置个人设置的地方

  2. ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取。(~/.bashrc只针对当前用户,变量的生命周期是永久的)

  3. ~/.bash_profile or ~/.bash_login or /.profile。**/.bash_profile是交互式login方式进入 bash 运行的,~/.bashrc 是交互式 non-login 方式进入 bash 运行的。通常二者设置大致相同,所以通常前者会调用后者。**每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。(如果~/目录下没有.bash_profile则新建立一个)

    当一个shell关闭时,在bash_profile中定义的系统变量则会失效。因此,每打开一个新的shell时都要运行一次source bash_profile.而且针对当前用户。

  4. ~/.pam_environment:用户级的环境变量设置文件,没有做测试,不知道管不管用。

  5. ~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件。另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。

环境变量文件的执行顺序

在登录Linux时要执行文件的过程如下:

在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 /.profile文件中的其中一个,用户主目录下文件的执行的顺序为:/.bash_profile -> ~/.bash_login -> ~/.profile。

如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。

因为在 ~/.bash_profile文件中一般会有下面的代码:

if [ -f ~/.bashrc ] ; then. ./bashrc
fi
~/.bashrc中,一般还会有以下代码:if [ -f /etc/bashrc ] ; then. /etc/bashrc
fi

所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。

所以整体的执行顺序为: /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

各种环境变量设置文件顺序的用处

1)先将 export LANG=zh_CN加入/etc/profile,退出系统重新登录,登录提示显示英文。

2)先将 /etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_CN加入 /etc/environment,退出系统重新登录,登录提示显示中文。

用户环境建立的过程中总是先执行 /etc/profile,然后再读取 /etc/environment。

为什么会有如上所叙的不同呢?而不是先执行/etc/environment,后执行/etc/profile呢?

这是因为: /etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。

系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,如日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。

对于用户的shell初始化而言是先执行/etc/profile,再读取文件/etc/environment;对整个系统而言是先执行/etc/environment。这样理解正确吗?

登陆系统时的顺序应该是:

/etc/enviroment --> /etc/profile -->$HOME/.profile−−>$HOME/.env (如果存在)

/etc/profile 是所有用户的环境变量

/etc/enviroment是系统的环境变量

登陆系统时shell读取的顺序应该是:

/etc/profile ->/etc/enviroment -->$HOME/.profile−−>$HOME/.env

原因应该是用户环境和系统环境的区别了,如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值,那应该是以用户环境为准了。

常用环境变量介绍

PATH

PATH是可执行文件的搜索路径,是我们最常接触到的,因为我们命令行中的每句能运行的命令,如lstopps等,都是系统通过PATH找到了这个命令执行文件的所在位置,再run这个命令(可执行文件)。

查看PATH环境变量,可以直接用echo $PATH,输出的结果是以冒号分隔的;为了改善可读性,我们可以将冒号替换为换行符:echo $PATH | sed "s/:/\n/g"。详见Linux中的awk、sed、grep及正则表达式详解中的例子。

LIBRARY_PATH和LD_LIBRARY_PATH

这两个路径可以放在一起讨论,

  • LIBRARY_PATH是程序编译期间查找动态链接库时指定查找共享库的路径
  • LD_LIBRARY_PATH是程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径

两者的共同点是,库是这两个路径和PATH路径的区别,PATH是可执行文件。

两者的差异点是使用时间不一样。一个是编译期,对应的是开发阶段,如gcc编译;一个是加载运行期,对应的是程序已交付的使用阶段。

LD_PRELOAD

LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库,一方面,我们可以以此功能来使用自己的或是更好的函数(比如,你可以使用Google开发的tcmalloc来提升效率),而另一方面,我们也可以向别人的程序注入程序,从而达到特定的目的。

PS1

PS1环境变量用于改变终端的提示符。比如:

export PS1="$ "

其他环境变量

注意以上也不是穷举列出了环境变量,而是除了上面最常用的几个之外,另外一些比较常用的。

  • $HOME 用户家目录
  • $LOGNAME 当前用户的登录名
  • $HOSTNAME 主机的名称
  • $SHELL 用户在使用的Shell解释器名称
  • $HISTSIZE 输出的历史命令记录条数
  • $HISTFILESIZE 保存的历史命令记录条数
  • PS2 附属提示符
  • $MAIL 邮件保存路径
  • $LANG 系统语言、语系名称
  • $RANDOM 生成一个随机数字
  • $EDITOR 用户默认的文本编辑器

查看和修改环境变量的命令

Linux也提供了修改和查看环境变量的命令!下面通过几个实例来说明:

  1. echo 显示某个环境变量值 echo $PATH

  2. export 设置一个新的环境变量 export HELLO=hello,在shell的命令行下直接使用[export 变量名=变量值] 定义变量,该变量只在当前的shell(BASH)或其子shell(BASH)下是有效的,shell关闭了,变量也就失效了,再打开新shell时就没有这个变量,需要使用的话还需要重新定义。要想在永久地修改环境变量,需要像上面一样在变量文件中export。

  3. env 显示所有环境变量

  4. set 显示本地定义(系统中已经存在)的shell变量以及设置shell变量的新变量值,如果未指定值,则该变量值将被设为NULL。

  5. unset 清除环境变量 unset HELLO

  6. readonly 设置只读环境变量 readonly HELLO ,如果使用了readonly命令的话,变量就不可以被修改或清除了。

更改方式

在当前shell中改变环境变量

直接在当前shell中执行:

export PS1="$ "

永久改变环境变量

将环境变量修改的命令添加到配置文件中,这样每次新打开的shell也会时想要的环境变量配置了。

vim ~/.bashrc
export PS1="$ "    # 将这一句添加到最后

Ref:

https://www.imooc.com/article/43747

http://blog.itpub.net/69979681/viewspace-2743590/

https://blog.csdn.net/u010533843/article/details/54986646

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/532704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[分布式训练] 单机多卡的正确打开方式:PyTorch

[分布式训练] 单机多卡的正确打开方式:PyTorch 转自:https://fyubang.com/2019/07/23/distributed-training3/ PyTorch的数据并行相对于TensorFlow而言,要简单的多,主要分成两个API: DataParallel(DP&am…

上学期C语言复习

C语言&#xff1a;面向过程例&#xff1a;完成两个单元内容的交换 &#xff1a; #include<stdio.h> //定义一个完成两个数据交换的函数 //void swap(int m,int n) void swap(int*m,int* n) { int temp;//临时单元 temp*m; *m*n; *ntemp; } int main() {int a5,b10; print…

[分布式训练] 单机多卡的正确打开方式:Horovod

[分布式训练] 单机多卡的正确打开方式&#xff1a;Horovod 转自&#xff1a;https://fyubang.com/2019/07/26/distributed-training4/ 讲完了单机多卡的分布式训练的理论、TensorFlow和PyTorch分别的实现后&#xff0c;今天瓦砾讲一个强大的第三方插件&#xff1a;Horovod。 …

【c语言数据结构笔记】1.2 数据结构

1.2数据结构 数据元素并独立 结构实体关系 形式定义&#xff08;D&#xff0c;S&#xff09; 其中D是数据元素的有限集&#xff0c;S是D上关系的有限集 eg&#xff1a;12位数&#xff1a;132423451233 分成三组四位数 次序关系<a1,a2><a2,a3> 遵守次序关系 eg&…

使用Apex进行混合精度训练

使用Apex进行混合精度训练 转自&#xff1a;https://fyubang.com/2019/08/26/fp16/ 你想获得双倍训练速度的快感吗&#xff1f; 你想让你的显存空间瞬间翻倍吗&#xff1f; 如果我告诉你只需要三行代码即可实现&#xff0c;你信不&#xff1f; 在这篇博客里&#xff0c;瓦砾…

【数据结构1.3笔记】研究内容

1.3研究内容 数据结构&#xff08;D&#xff0c;S&#xff09; {逻辑结构&#xff1a; {物理结构&#xff08;存储结构&#xff09; {数据的运算 1.逻辑结构 1 集合&#xff1a;集合&#xff0c;没有逻辑关系 2 线性结构 “一对一” 3树形结构 层次关系 4图形结构 练习&…

Linux下的LD_PRELOAD环境变量与库打桩

Linux下的LD_PRELOAD环境变量与库打桩 LD_PRELOAD是Linux系统的一个环境变量&#xff0c;它可以影响程序的运行时的链接&#xff08;Runtime linker&#xff09;&#xff0c;它允许你定义在程序运行前优先加载的动态链接库&#xff0c;一方面&#xff0c;我们可以以此功能来使…

2019年蓝桥杯第一题

第一题 标题&#xff1a;组队&#xff08;本题总分&#xff1a;5 分&#xff09; 作为篮球队教练&#xff0c;你需要从以下名单中选出 1 号位至 5 号位各一名球员&#xff0c; 组成球队的首发阵容。 每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位…

深度学习编译:MLIR初步

深度学习编译MLIR初步 深度模型的推理引擎 目前深度模型的推理引擎按照实现方式大体分为两类&#xff1a;解释型推理引擎和编译型推理引擎。 解释型推理引擎 一般包含模型解析器&#xff0c;模型解释器&#xff0c;模型优化器。 模型解析器负责读取和解析模型文件&#xff…

深入浅出LLVM

深入浅出LLVM 转自&#xff1a;https://www.jianshu.com/p/1367dad95445 什么是LLVM&#xff1f; LLVM项目是模块化、可重用的编译器以及工具链技术的集合。 美国计算机协会 (ACM) 将其2012 年软件系统奖项颁给了LLVM&#xff0c;之前曾经获得此奖项的软件和技术包括:Java、A…

蓝桥杯真题训练 2019.2题

2019第二题 标题&#xff1a;年号字串&#xff08;本题总分&#xff1a;5 分&#xff09; 小明用字母 A 对应数字 1&#xff0c;B 对应 2&#xff0c;以此类推&#xff0c;用 Z 对应 26。对于 27 以上的数字&#xff0c;小明用两位或更长位的字符串来对应&#xff0c;例如 AA…

一分钟系列:什么是虚拟内存?

一分钟系列&#xff1a;什么是虚拟内存&#xff1f; 转自&#xff1a;https://mp.weixin.qq.com/s/opMgZrXV-lfgOWrNUMKweg 注&#xff1a;一分钟系列的篇幅都不长&#xff0c;适合吃饭蹲坑、地铁公交上食用&#xff5e; 内存对于用户来说就是一个字节数组&#xff0c;我们可…

蓝桥杯真题训练 2019.3题

标题&#xff1a;数列求值 &#xff08;本题总分&#xff1a;10 分&#xff09;### 给定数列 1, 1, 1, 3, 5, 9, 17, …&#xff0c;从第 4 项开始&#xff0c;每项都是前 3 项的和。求 第 20190324 项的最后 4 位数字。 【答案提交】 这是一道结果填空的题&#xff0c;你只需…

11-Kafka

1 Kafka Kafka是一个分布式流式数据平台&#xff0c;它具有三个关键特性 Message System: Pub-Sub消息系统Availability & Reliability&#xff1a;以容错及持久化的方式存储数据记录流Scalable & Real time 1.1 Kafka架构体系 Kafka系统中存在5个关键组件 Producer…

虚拟内存精粹

虚拟内存精粹 标题&#xff1a;虚拟内存精粹 作者&#xff1a;潘建锋 原文&#xff1a;HTTPS://strikefreedom.top/memory-management–virtual-memory 导言 虚拟内存是当今计算机系统中最重要的抽象概念之一&#xff0c;它的提出是为了更加有效地管理内存并且降低内存出错的概…

蓝桥杯真题训练 2019.4题

标题&#xff1a; 数的分解&#xff08;本题总分&#xff1a;10 分&#xff09; 【问题描述】 把 2019 分解成 3 个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包 含数字 2 和 4&#xff0c;一共有多少种不同的分解方法&#xff1f; 注意交换 3 个整数的顺序被视…

深度学习自动编译和优化技术调研

深度学习自动编译和优化技术调研 转自&#xff1a;https://moqi.com.cn/blog/deeplearning/ 作者&#xff1a;墨奇科技全栈开发 在墨奇科技&#xff0c;我们需要将一些包含深度神经网络&#xff08;DNN&#xff09;的 AI 算法移植到边缘端的设备&#xff0c; 这些设备往往使用 …

三元组数据处理系统

include<stdio.h> include<stdlib.h> define OK 1 define ERROR 0 define OVERFLOW -2 typedef int Status; typedef float ElemType; typedef ElemType *Triplet; // 声明Triplet为ElemType指针类型 //三元组的初始化 Status initTriplet(Triplet &T, E…

Copy-On-Write COW机制

Copy-On-Write COW机制 转自&#xff1a;https://zhuanlan.zhihu.com/p/48147304 作者&#xff1a;Java3y 前言 只有光头才能变强 在读《Redis设计与实现》关于哈希表扩容的时候&#xff0c;发现这么一段话&#xff1a; 执行BGSAVE命令或者BGREWRITEAOF命令的过程中&#xff0c…

实验报告:抽象数据类型的表现和实现

实验报告&#xff1a;抽象数据类型的表现和实现 实验内容 基本要求&#xff1a; 设计实现抽象数据类型“三元组”&#xff0c;要求动态分配内存。每个三元组由任意三个实数的序列构成&#xff0c;基本操作包括&#xff1a;创建一个三元组&#xff0c;取三元组的任意一个分量&…