一.系统环境变量位置

  在上章中,知道了如何修改系统环境变量,如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 (系统环境变量位置, 环境变量持久化)的更多相关文章

  1. Linux中使用export命令设置环境变量

    Linux export 命令 2011-08-31 22:36:39|  分类: 命令总结|举报|字号 订阅     功能说明:设置或显示环境变量. ######################## ...

  2. 00006 - Linux中使用export命令设置环境变量

    功能说明:设置或显示环境变量. #################################################################################### ...

  3. windows+linux下jdk安装及java环境变量配置

    对于初学java的用户来说,可能第一件要做的事情就是安装jdk及配置环境,以下内容主要讲述windows及linux下jdk的安装以及环境变量的配置. 1.首先下载相应平台可用版本jdk安装文件,可以 ...

  4. MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析

    MPC8313ERDB在Linux从NAND FLASH读取UBoot环境变量的代码分析 Yao.GUET@2014-05-19 一.故事起因 由于文件系统的增大,已经大大的超出了8MB的NOR FL ...

  5. Linux下jdk的安装和环境变量的配置

    Linux下jdk的安装和环境变量的配置 一.jdk的下载 方式一:在官网下载 http://www.oracle.com/technetwork/java/javase/downloads/inde ...

  6. linux下查看和添加PATH环境变量

    linux下查看和添加PATH环境变量 $PATH:决定了shell将到哪些目录中寻找命令或程序,PATH的值是一系列目录,当您运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑你的 PA ...

  7. Linux系列(11) - PATH环境变量

    前言 在Liunx当中要想执行"执行脚本"."执行文件"或者"执行命令",需要用绝对路径:因此环境变量就出来了,将路径放到环境变量中,环境变 ...

  8. Shell变量之自定义变量、环境变量

    1:环境变量        环境变量可以帮我们达到很多功能-包括家目录的变换啊.提示字符的显示啊.运行文件搜寻的路径啊等等的那么,既然环境变量有那么多的功能,问一下,目前我的 shell 环境中, 有 ...

  9. 玩转变量、环境变量以及数学运算(shell)

    变量和环境变量    var=value  给变量赋值,输出语句:$ echo $var或者是$ echo ${var},记住中间有个空格 例如:name="coffee" age ...

随机推荐

  1. ajax 与jsp servlet

    jQuery的Ajax实现异步传输List.Map_GOOD 分类: JAVA WEB前端2013-08-29 18:35 6296人阅读 评论(0) 收藏 举报 javajquerylistjson ...

  2. Android中 实现队列方式处理优先级信息

    需求:当界面在处理消息A时,突然接收到消息B,需要立马显示B的信息,然后再继续显示消息A,或者接收到消息C,再显示完消息A后再显示消息C: 原理很简单 在一个轮询中,查询消息列表中的元素,先处理优先级 ...

  3. 2019-1-18 Spark 机器学习

    2019-1-18 Spark 机器学习 机器学习 模MLib板 预测 //有视频 后续会补充 1547822490122.jpg 1547822525716.jpg 1547822330358.jp ...

  4. 图解HTTP系列

    第一章 第二章 第三章 第四章 第五章 第六章 第七章 第九章 第十章

  5. The First Day Of Cnblogs

    The fear of the LORD is the beginning of wisdom,and knowledge of the Holy One is understanding. ——Pr ...

  6. Java:Copy-On-Write容器

    Copy-On-Write简称COW,是一种用于程序设计中的优化策略.其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改, ...

  7. Python19/1/11--标签与过滤器/Django模块导入继承/静态文件配置

      1 模板语言之变量: -{{ }} 相当于执行了print -深度查询 . 如果是方法,不能加括号,不能传参数2 过滤器 {{ 变量|过滤器的名字:'参数' }} -add -default -s ...

  8. jenkins 使用Git 报错:SSL certificate problem: self signed certificate in certificate chain

    在启动java的脚本上执行 增加参数: -Dorg.jenkinsci.plugins.gitclient.GitClient.untrustedSSL=true 即可!!

  9. shell编写自动化安装dhcp服务

    #!/bin/bash#Auth:Darius#自动化安装dhcp服务#"$1"为测试IP,用来查看IP段是否能通eno=`ifconfig|awk '{print $1}'|he ...

  10. Exp2后门原理与实践_20154305 _ 齐 帅

    Exp2后门原理与实践 20154305 _ 齐 帅 2.1简单后门 一.后门工具介绍 1.netcat(nc.ncat) 是一个底层工具,进行基本的TCP UDP数据收发.常被与其他工具结合使用,起 ...