Linux编程 13 (系统环境变量位置, 环境变量持久化)
一.系统环境变量位置
在上章中,知道了如何修改系统环境变量,如PATH变量,以及创建自己的全局环境变量和局部环境变量。这篇学习怎么让环境变量的作用持久化。在此之前,先了解下系统环境变量文件会在哪些位置,当使用bash shell时,bash是如何查找环境变量位置的。下面先来介绍几个文件,这些文件叫启动文件或叫环境文件。
bash检查的启动文件(环境文件)取决于你启动bash shell的方式。启动bash shell有3种方式:
(1) 登录时的默认登录shell。
(2) 交互式shell。
(3) 运行脚本的非交互式shell。
1.1 登录shell
登陆shell是指:(1) 用户登陆时,输入用户名和密码后启动的shell(例如使用ssh登录远程主机等);(2) 通过带--login参数的命令:bash --login而启动的shell。当登录linux系统时,bash shell作为登录shell启动,登录shell会从5个不同的启动文件里读取命令。包括:/etc/profile, $HOME/.bash_profile, $HOME/.bashrc, $HOME/.bash_login, $HOME/.profile。而/etc/profile文件是系统默认的bash shell的主启动文件。另外4个启动文件是针对用户的(不同发行版中,四个启动文件一般都只有一到二个),可根据个人需求定制。
(1) /etc/profile文件
只要登录了linux系统,bash就会执行/etc/profile启动文件中的命令(不同发行版的/etc/profile,有不同的设置和命令),profile文件内容如下图所示:
profile文件内容太长,截取了一段。 上图有个for语句,它用来循环读取/etc/profile.d目录下的所有文件。该文件目录包含以下文件,如下图所示:
上图启动文件中sh后缀的供bash shell 使用, csh后缀的供 c shell使用。lang.csh和lang.sh文件会尝试去判定系统上采用的默认语言字符集。对应LANG环境变量。
(2) $HOME目录下的启动文件
HOME目录下的隐藏文件,找到了$HOME/.bash_profile, $HOME/.bashrc。每个用户都可以编辑这些文件添加自己的环境变量,这此环境变量会在每次启动 bash sehll 会话时生效。 HOME目录如下图所示:
.bash_profile启动文件会先去检查HOME目录下是不是有一个叫.bashrc的启动文件,如果有就会先执行里面的命令。bash_profile文件内容如下图所示:
上图中,可以看到在.bash_profile文件中给PATH变量添加了一个目录路径,并用export PATH 导入到全局中。在.bash_profile文件中加的变量可以持久化。
1.2 交互式shell进程
交互式shell是指:就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。命令行提示符输入命令,只会检查用户HOME目录中的.bashrc文件。 该文件两个作用:1是查看/etc目录下通用的bashrc文件,2是为用户提供一个定制自己的命令别名(前面讲alias命令)和私有脚本函数(后面介绍)。 .bashrc文件内容如下图所示:
1.3 非交互式shell
非交互式shell是指:以shell script(非交互)方式执行。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾EOF,shell也就终止了。 系统执行shell脚本时用的这是这种shell。区别是它没有命令提示符。但当你的系统上运行脚本时,也许希望能够运行一些特定启动的命令。
为了处理这种情况bash shell提供了BASH_ENV环境变量。当shell 启动一个非交互式shell进程时,它会检查这个环境变量来查看要执行的启动文件。默认情况下并未设置该变量,使用printenv命令只返回提示符:
正如上图所示:BASH_ENV环境变量没有设置值。这种非交互式shell 一般通过启动一个子shell来执行。如果父shell是登录shell,那么可以从/etc/profile,/etc/profiled/*.sh和$HOME/.bashrc文件中继承这些变量。如果父shell中的变量是局部变量时,那么子shell无法继承。如果不启动子shell, 变量已存在于当前shell中,就算不设置BASH_ENV,也可以使用当前的局部和全局变量。
交互式与非交互式二者区别:读取的配置文件不同,交互式bash必然读取~/.bashrc文件;非交互式bash读取的是环境变量BASH_ENV(通常情况下)所指定的配置文件。
二. 环境变量持久化
上面了解了各种shell进程对应的环境文件,找出永久性环境变量就容易多了。可以利用这些文件来创建自己的永久性全局变量或局部变量。全局变量是对所有用户都需要使用的变量,可以将新的变量或修改过的变量设置放在/etc/profile文件中,但升级了发行版该文件也会更新,所以这点要注意 (对所有用户)。
最好是在/etc/profile.d目录中创建一个以.sh结尾的文件,把所有新的变量或修改过的变量全部放在此文件中(对所有用户)。
对于存储个人用户永久性bash shell变量的地方是$HOME/.bashrc文件。这一点适用于所有类型的shell进程(仅对当前用户)。
下面来演示给mysql工具包路径,添加到PATH全局变量中:
(1)在虚拟根目录下输入mysqldump 工具,提示未找到命令,如下图所示:
(2)找到mysqldump工具包的位置,路径是/usr/local/mysql/bin。如下图所示:
(3) 查看现有PATH的路径列表,以冒号分隔的默认有5个路径。如下图所示:
(4) 在$HOME/.bash_profile文件中加入一个PATH全局变量值,路径为/usr/local/mysql/bin。如下图所示:
(5) exit退出终端或shutdown后重新开机,在虚拟根目录下输入mysqldump 工具,PATH设置的mysql工具包路径永久生效。如下图所示:
再切换到mysql用户下,PATH的设置也是生效的,说明是跨用户生效的。
在root用户下,使用子shell, PATH的设置也是生效的,说明跨进程,已设置成了全局变量。
(6) 最后在看下PATH路径,/usr/local/mysql/bin 已添加了
Linux编程 13 (系统环境变量位置, 环境变量持久化)的更多相关文章
- Linux中使用export命令设置环境变量
Linux export 命令 2011-08-31 22:36:39| 分类: 命令总结|举报|字号 订阅 功能说明:设置或显示环境变量. ######################## ...
- 00006 - Linux中使用export命令设置环境变量
功能说明:设置或显示环境变量. #################################################################################### ...
- windows+linux下jdk安装及java环境变量配置
对于初学java的用户来说,可能第一件要做的事情就是安装jdk及配置环境,以下内容主要讲述windows及linux下jdk的安装以及环境变量的配置. 1.首先下载相应平台可用版本jdk安装文件,可以 ...
- MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析
MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析 Yao.GUET@2014-05-19 一.故事起因 由于文件系统的增大,已经大大的超出了8MB的NOR FL ...
- Linux下jdk的安装和环境变量的配置
Linux下jdk的安装和环境变量的配置 一.jdk的下载 方式一:在官网下载 http://www.oracle.com/technetwork/java/javase/downloads/inde ...
- linux下查看和添加PATH环境变量
linux下查看和添加PATH环境变量 $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑你的 PA ...
- Linux系列(11) - PATH环境变量
前言 在Liunx当中要想执行"执行脚本"."执行文件"或者"执行命令",需要用绝对路径:因此环境变量就出来了,将路径放到环境变量中,环境变 ...
- Shell变量之自定义变量、环境变量
1:环境变量 环境变量可以帮我们达到很多功能-包括家目录的变换啊.提示字符的显示啊.运行文件搜寻的路径啊等等的那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有 ...
- 玩转变量、环境变量以及数学运算(shell)
变量和环境变量 var=value 给变量赋值,输出语句:$ echo $var或者是$ echo ${var},记住中间有个空格 例如:name="coffee" age ...
随机推荐
- Maven引入自定义jar包
1.将项目打成jar包 或者下载某个jar包 放在某个目录下(随便吧,桌面也行),这里是放在F:/ jar包为 alipay.jar 2.给jar包取个名字 用原名也行(maven打包默认会 ...
- HTML5调用手机的Datepicker(日期选择器)
HTML5 拥有多个新的表单输入类型.这些新特性提供了更好的输入控制和验证,包含了如下新的输入类型: email url number range Date pickers (date, month, ...
- JAVA 8 主要新特性 ----------------(七)新时间日期 API ----- Duration “时间”间隔
Duration:用于计算两个“时间”间隔 简介: 用法: 1.Zero常量 实例: Duration duration = Duration.ZERO; System.out.println(&qu ...
- UE4杂记
一些学习UE4时的笔记,转载请注明出处. ☆ UE4逻辑 Actor 是由 AActor 类派生而来的类实例:能被放入游戏世界场景的所有游戏性对象的基础类.对象是继承自 UObject 类的类实例:虚 ...
- 【转】javaUDP套接字通信
Java UDP网络编程 - 最简单示例 转自 http://blog.csdn.net/wintys/article/details/3525643 /** *UDPServer *@autho ...
- 关于信息系统设计与开发——案例:VIP系统
一.关于信息系统设计与开发 信息系统开发流程先对需求分析系统分析,设计数据库,设计程序,再对测试数据进行测试. 在程序设计中运用了接口:定义一个接口,可以有多种实现.变量声明为接口变量,调用接口方法, ...
- Django积木块五——分页
分页 django本身带有分页功能,为什么要用他呢?因为它的代码更为简洁,并且在做筛选的时候会把url中的所有参数都组装起来,并且加上分页.也就是做筛选中的结果也可以用这个分页. pip instal ...
- 手把手教你利用Python自动下载CL社区图片
需求描述: 最近发现CL社区上好多精华的帖子分享的图片非常棒,好想好想保存下来,但是一张一张地保存太费时间了,因此,造物者思想主义的我就想动手写个工具,实现只要输入帖子的链接,就能把所有的精华 ...
- Monitor类:Object synchronization method was called from an unsynchronized block of code.
最近,在维护以前老系统的时候,发现了这样一个错误:Object synchronization method was called from an unsynchronized block of co ...
- opencl 参考源码及benchmark
转载:https://www.zhihu.com/question/25539755/answer/44917891 CUDA 5之前的版本有OpenCL的sample,可以上网找找看 AMD APP ...