linux 重读环境变量,关于linux中使用source /etc/profile重新读取配置后,新的环境变量只能在当前终端里面有效,新开的终端提示 command not found...

文章目录

问题

知识点

问题分析及解决

补充

问题

在使用linux桌面环境(通常是ubuntu/debian/deepin等版本的linux)的时候,新增环境变量后,会使用source /etc/profile命令使新的环境变量立刻生效而不用重新启动系统。但经常会遇到使用source /etc/profile命令之后,新的环境变量只能在当前终端里面有效,而在新打开的终端中,使用新的环境变量就找不到了。

先通过操作来复现一下这个过程,我使用的linux分支是deepin(其他版本的类似),通过图形界面打开终端操作进入,准备添加一个新的变量testEnv。

# 查看系统中,是否已经存在名字为 testEnv 的环境变量,如果输出为空,表示环境变量不存在

echo $testEnv

# 环境变量不存在,就添加 testEnv 到环境变量

sudo bash -c "echo testEnv=888888 >> /etc/profile"

# 输出/etc/profile最后一行,查看是否添加成功

tail -1 /etc/profile

# testEnv=888888

# 使 testEnv 环境变量生效

source /etc/profile

# 查看环境变量 testEnv 的值,如果输出 888888 ,表示环境变量创建成功

echo $testEnv

# 888888

新建一个终端窗口,看下是否可以输出环境变量testEnv的值。

# 输出结果为空

echo $testEnv

但是,只要重启系统,一切就正常了。

问题在于为什么?

知识点

我们知道,linux中环境变量是通过配置文件添加的,在系统启动的时候,通过加载不同的配置文件来初始化环境变量,所以环境变量找不到的问题,归根结底是配置文件的加载问题。搞清楚linux中配置文件的加载顺序,上面遇到的问题也就不难理解了。

shell是用户与Linux系统进行交互的媒介,它在运行时具有两种属性,即“交互”与“登陆”,由此衍生出交互式登录和非交互式登录两种模式。

交互式登录shell进程是指直接通过某终端输入账号密码后登录打开的shell进程,如使用ssh或者堡垒机进行远程主机连接,或者使用 su - username 或者 su -l username 执行的登录用户切换等。

非交互式登录shell进程:图形界面下打开的终端、su username 执行的登录切换、直接运行脚本或者bash -c执行一段命令的时候。

linux 中常见的配置文件有/etc/profile、~/.bash_profile、~/.bashrc、/etc/bashrc和/etc/profile.d/*。

/etc/profile:此文件为系统的每个用户设置环境信息,系统中每个用户登录时都要执行这个脚本,如果系统管理员希望某个设置对所有用户都生效,可以写在这个脚本里,该文件也会从/etc/profile.d目录中的配置文件中搜集shell的设置。

~/.bash_profile:每个用户都可使用该文件设置专用于自己的shell信息,当用户登录时,该文件仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

~/.bashrc:该文件包含专用于自己的shell信息,当登录时以及每次打开新shell时,该文件被读取。

/etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。

关于配置文件加载顺序的说法,网上有很多,看起来也不尽相同,其实主要区别在与不同的linux发行版,包含的配置文件也是有很大区别的,即使有名字相同的配置文件,配置文件里面的内容也是大相径庭。但是基本上所有的linux发行版都会包括/etc/profile(登录后读取的第一个配置文件)和~/.bashrc两个配置文件。

对于交互式登录shell来说,一定会读取的配置文件的顺序是/etc/profile --> ~/bashrc。

对于非交互式登录shell来说,一定会读取的配置文件属性是~/.bashrc,如果~/.bash_profile 存在的话,顺序是这样的~/.bash_profile --> ~/.bashrc 。

对于其他的各种常见配置文件的读取,以及是读取,主要取决于/etc/profile 或者 ~/bashrc 里面的具体内容,比如在centos7 的/etc/profile中有如下一段代码,是用来载入/etc/profile.d/*.sh配置文件的。

for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do

if [ -r "$i" ]; then

if [ "${-#*i}" != "$-" ]; then

. "$i"

else

. "$i" >/dev/null

fi

fi

done

deepin系统中的.bashrc里面有一段代码,用来读取命令别名声明文件。

# Get the aliases and functions

if [ -f ~/.bash_aliases ]; then

. ~/.bash_aliases

fi

所以,系统配置文件的读取顺序,需要根据系统版本的不同去了解读取顺序。

每次在配置文件中配置的新环境变量,只会对随后新启动的shell进程生效,如果想让配置文件立即生效,需要让shell进程重读配置文件,这就需要进行类似source /etc/profile 或者 . /etc/profile 这样的操作。

问题分析及解决

一般遇到本文开头说到的问题的同学,都是在图形界面下使用终端的配置的环境变量,然后通过source /etc/profile 重新读取配置文件,然后打开一个新的终端的时候,使用命令就是出现comand not found的问题。

结合上面的知识点看下,在图形界面下使用的终端属于非交互式登录的shell,以我使用的deepin系统为例,新开一个终端时,读取的配置文件应该是~/.bashrc。而新增的环境变量配置在/etc/profile,所以出现在新开终端找不到环境变量的问题。

解决办法:

在新开终端,执行source /etc/profile,比较麻烦

将环境变量配置在,~/.bashrc 中,可以解决

在~/.bashrc中添加source /etc/profile,这样就可以为每一个新开的终端重新读取一次/etc/profile配置文集,可以解决,多次读取/etc/profile没有发现有什么副作用。

补充

网上早期很多关于java、node等的环境变量配置的文章,感觉都是针对搭建centos服务器或者测试机的,他们之所以没有这个问题,是因为服务器基本都是通过ssh远程登录,是交互式登录模式的,每次打开一个新的远程连接,都会重新读取/etc/profile,所以不会有command not found的问题。而个人用的电脑,基本都是图形界面直接操作,所以会遇到比较多的这种问题。

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

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

相关文章

OCP China Day 2021:开放计算十年,以全球协作打破创新边界

7月27日,由 OCP 社区主办、浪潮承办的第三届 OCP China Day 2021在北京举行,近千名IT工程师和数据中心从业者参会。开放计算正成为当前乃至未来数据中心的创新主力,通过全球化协作的创新模式,解决数据中心基础设施可持续发展的重大…

dubbogo 3.0:牵手 gRPC 走向云原生时代

作者 | 李志信 于雨 来源|阿里巴巴云原生公众号 自从 2011 年 Dubbo 开源之后,被大量中小公司采用,一直是国内最受欢迎的 RPC 框架。2014 年,由于阿里内部组织架构调整,Dubbo 暂停维护了一段时间,之后随着 Spring Cl…

时序转化为图构建高效可解释的时序分析模型

本文简要介绍我们刚刚被WSDM2021会议录用并即将发表的论文"Time-Series Event Prediction with Evolutionary State Graph"(论文地址),在文中我们提出了一种将时序转化为图进行表示建模的方法。同时我们把所实现的方法落地为阿里云SLS的智能巡检服务&…

linux 查看主机版本,Linux下如何查看版本信息的方法步骤

Linux下如何查看版本信息, 包括位数、版本信息以及CPU内核信息、CPU具体型号等等,整个CPU信息一目了然。1、# uname -a (Linux查看版本当前操作系统内核信息)Linux localhost.localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 a…

通信行业力推零信任标准,蔷薇灵动微隔离首批获证

7月27日至28日,以“数字裂变,可信发展”为主题的2021可信云大会在京拉开帷幕。大会邀请云计算行业专家学者、知名企业代表、行业大咖同台论道,围绕行业发展趋势、落地应用、新兴技术、企业数字化上云等热门议题展开观点碰撞,带来前…

万张图片,流畅体验——记一次 Vue 列表渲染

简介: ### 背景 团队目前的Web端产品中需要显示两个列表视图:卡片列表和条目列表,并且在点击切换按钮的时候,对两个列表进行切换显示。 ![条目列表](https://ata2-img.oss-cn-zh 背景 团队目前的Web端产品中需要显示两个列表视图…

可动态调节参数的线程池实现

背景 线程池是一种基于池化思想管理线程的工具,使用线程池可以减少创建销毁线程的开销,避免线程过多导致系统资源耗尽。在高并发的任务处理场景,线程池的使用是必不可少的。在双11主图价格表达项目中为了提升处理性能,很多地方使用…

我的世界服务器linux加mod,在Linux下搭建带MOD 我的世界(Minecraft)服务器

在Linux下搭建带MOD 我的世界(Minecraft)服务器系统要求官方服务器推荐配置要求如下:CPU:Intel Core-Based CPUs or AMD K8-Based CPUs IBM 970 2.0 GHz and better内存:5 GiB硬盘空间:16 GiB上行宽带:8 Mbit/s下行宽带…

2020-12-17

集团关于Blink的相关使用文档已经十分齐全,这里不准备再过多赘述。这篇文章准备对Blink所基于的Apache社区开源产品–Flink的架构做一些浅显分析。 一:Flink历史、基本架构及分布式部署 历史 Flink项目最早开始于2010年由柏林技术大学、柏林洪堡大学、…

分布式、云原生技术之后,分布式云或成数字化转型新利器

编辑 | 宋 慧 出品 | CSDN云计算 头图 | 2021可信云大会现场 7月27日,2021年可信云大会在京顺利开幕。本届大会以“数字裂变,可信发展”为主题,云计算行业专家学者、众多国内一线云计算厂商、头部客户同台论道,围绕云计算行业趋势…

linux磁盘配额edquota,Linux磁盘配额(Quota)

开启磁盘的 quota 功能:由于 quota 需要在 ext 的 Linux 延伸格式档案才可以启动,所以你就必须要将准备开启quota 的磁盘启动参数,写进入 quota 的磁盘设定才行 ( /etc/fstab )!以我的例子而言,我想要在/home 底下进行…

图文存储常识:单机、集中、分布式、云、云原生存储

背景 本文主要对杨传辉(日照)《大规模分布式存储系统原理解析与架构实战》、大话存储、网络资源(具体参考文末链接)及个人理解进行整理,意在构建出存储发展基本轨迹和一些基本常识,让更多像我一样的初入者有个宏观上的认知。 存储…

年终盘点 | 七年零故障支撑 双11 的消息中间件 RocketMQ,怎么做到的?

作者 | 愈安 来源|阿里巴巴云原生公众号 2020 年双十一交易峰值达到 58.3W 笔/秒,消息中间件 RocketMQ 继续数年 0 故障丝般顺滑地完美支持了整个集团大促的各类业务平稳。今年双十一大促中,消息中间件 RocketMQ 发生了以下几个方面的变化: …

2021 ISC会上山石网科重磅发布智能下一代防火墙A系列,重新定义边界安全防御

勒索病毒频繁、威胁隐匿于加密流量、高级威胁藏于内部、物联网安全盲区众多,数字化发展及其带来的网络威胁态势正在发生着质的变化,网络安全所要求的防护能力不断提高。防火墙作为企业安全基础架构最重要的基石之一,其辐射到企业的边界、内网…

十年,他们在云上修了一条“高速公路”

简介: 阿里云网络的工程师们希望,通过这个平台,帮助企业更加智能地运维自己的网络、更加便捷地配置自己的网络,让上云的企业在“云高速”中实现“自动驾驶”。他们说,把路修的更好,让网络更简单&#xff0c…

linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...

redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网(2011-12-20 06:11:51)标签:上网杂谈redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网查看路由的信息如下…

阿里云超算异构Spot集群,助力深势科技30%成本驱动MDaaS海量算力

本文主要介绍药物研发算法科技公司深势科技是如何实现低成本在阿里云上构建分子模拟MDaaS (Molecular Dynamics as a Service)超算集群。 客户简介 公司名称:深势科技 公司网址:http://dptech.deepmd.net/ 公司介绍&#xff1a…

一文读懂DataOps

作者:彭锋 宋文欣等来源:智领云科技大部分企业的数据平台建设要想顺利过渡到第三阶段,则离不开一个关键方法论—DataOps(数据运维)的帮助。DataOps 与 DevOps 十分形似,也有着与 DevOps 类似的软件开发角色…

Python 命令行库的大乱

当你想实现一个命令行程序时,或许第一个想到的是用 Python 来实现。比如 CentOS 上大名鼎鼎的包管理工具 yum 就是基于 Python 实现的。 而 Python 的世界中有很多命令行库,每个库都各具特色。但我们往往不知道其背后的设计理念,也因此在选择…

Linux系统初学者指南,观点|Linux 系统调用的初学者指南

在过去的几年中,我一直在做大量容器相关的工作。先前,我看到 Julien Friedman 的一个很棒的演讲,它用几行 Go 语言写了一个容器框架。这让我突然了解到容器只是一个受限的 Linux 进程中的机器。构建这个受限视图涉及到 Golang 系统调用包中的…