1. $HOME变量从哪里获得的?

HOME 本身是 shell 来设置的,你可以自己手工设置(例如使用 bash 的 export),也可以在 shell 的初始化文件中设置(例如 bash 的 .bash_profile 或者 .profile)。但是,除非你知道自己在做什么,还是不要修改它的好。

既然HOME本身是shell来设置的,那么shell从哪里读到这个配置呢?答案是/etc/passwd,例如:

Jack:x:501:501:Jack:/home/Jack:/bin/bash

当用户登录时密码验证后,读取该信息。

2. bash_profile与bashrc的区别,login-shell与non login-shell, 交互式shell。

/etc/profile:此文件为系统的所有用户设置全局环境变量,只要你登录了Linux系统,bash就会执行/etc/profile文件中的命令。profile文件会逐一访问位于/etc/profile.d目录的每一个文件,它为linux系统提供了一个集中存放用户登录时需要执行的应用专属的启动文件的地方。

~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell初始化信息,当用户登录时,该文件被执行。 一般设置让它调用用户的~/.bashrc文件.

上面这两个文件会在以login-shell形式启动bash shell时执行。

/etc/bashrc:只会在每次有新的交互式shell启动时,该文件才会运行,也就是在~/.bashrc脚本中被调用,默认文件中会设置一些环境变量,但是它并没有执行export命令让他们成为全局的。

~/.bashrc:该文件包含专用于你的bash shell的bash信息,每次以non login-shell模式即交互式shell启动时,该文件被读取.

[root@win Jack]# cat .bash_profile
# .bash_profile # Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH
[root@win Jack]# cat .bashrc
# .bashrc # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi # User specific aliases and functions

那什么是login-shell?什么是nonlogin-shell和交互式shell呢?这个问题刚开始很让我困扰。因为我平时都是直接登录到linux图形界面,打开shell的方面都是使用terminal终端打开的。

这里作出解释。

login-shell:就是通过非图形界面进行登录,例如Ctrl+Alt+F[ 2-7 ]切换到tty1~tty6登入时, 需要输入用户名和密码,此时取得的bash就称为login shell。

这个过程会运行以下文件:

--------> /etc/profile -----------> $HOME/.bash_profile   如果有$HOME/.bash_login 和 $HOME/.profile 文件也会运行 (我系统中没有这两个文件)

根据我的.bash_profile文件的设置,在.bash_profile文件中会调用  $HOME/.bashrc --------------> /etc/bashrc

也就是说,在我的机器中,用login-shell启动shell,文件的执行顺序是这样: /etc/profile ----------> $HOME/.bash_profile -----------> $HOME/.bashrc ----------> /etc/bashrc

non login-shell,交互式shell,就是我们最常用,需要注意的是interactive non-login shell从其父进程上继承过来环境变量。

举三个例子(1)以X window登入linux后,再以X 的图形化介面启动终端机,此时那个终端机并不需要再次的输入用户名和密码,那个bash的环境就称为non-login shell 
      (2)在原本的bash环境中再次下达bash这个指令,同样没有要求输入用户名和密码,那个第二个bash也是non-login shell

      (3)通过su命令切换用户获取的bash也是non-login shell。

如果bash是交互式non login-shell启动的,它不会去访问/etc/profile文件,而是去用户的HOME目录检查.bashrc时候存在。过程:

-----------> $HOME/.bashrc -----------> /etc/bashrc

由于non login-shell不是从非图形界面直接登录的,所以这个进程一定有父进程,而父进程某个父进程为登录进程,运行过/etc/profile和.bash_profile文件,因为/etc/profile中通过export设置的是全局的环境变量,子进程自然得到继承。

所以在通过交互式shell形式获取bash时,虽然没有去执行/etc/profile文件,但是依然拥有这些环境变量。

所以non login-shell中实际拥有,/etc/profile$HOME/.bash_profile中的设置的所有全局环境变量(局部环境变量得不到继承,以及$HOME/.bashrc, /etc/bashrc中设置的所有环境变量。

对此我做出了实验:

[Jack@win ~]$ cat .bashrc
# .bashrc # Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi # User specific aliases and functions echo ".bashrc has been executed."
[Jack@win ~]$ cat .bash_profile
# .bash_profile # Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH echo "bash_profile has been executed" 

在.bashrc 和.bash_profile文件中分别加上了一行测试语句。测试发现,当我们新起一个交互式shell的时候和su命令切换到oracle用户的时候(我也添加了类似的测试语句),发现都是只执行了.bashrc脚本。

Linux 环境变量详解的更多相关文章

  1. Linux环境变量详解与应用

    在bash shell中,环境变量分为: >全局变量 >局部变量 全局变量,不仅对shell可见,对其子进程也可见 查看预设的全局环境变量: ghostwu@dev:~$ printenv ...

  2. net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解

    asp.net core环境变量详解   环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...

  3. asp.net core环境变量详解

    环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...

  4. 【转】asp.net core环境变量详解

    asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境 ...

  5. Maya 常用环境变量详解

    Maya 常用环境变量详解 前言: Maya 的环境变量让用户可以很方便的自定义 Maya 的功能. 在 Maya 的 Help 帮助文档中有专门的一个章节< Environment Varia ...

  6. 如何查找YUM安装的JAVA_HOME环境变量详解

    如何查找YUM安装的JAVA_HOME环境变量详解  更新时间:2017年10月27日 09:44:56   作者:铁锚   我要评论 这篇文章主要给大家介绍了关于如何查找YUM安装的JAVA_HOM ...

  7. .NET Core 环境变量详解

    一.概述 软件从开发到正式上线,在这个过程中我们会分为多个阶段,通常会有开发.测试.以及上线等.每个阶段对应的环境参数配置我们会使用不同的参数.比如数据库的连接字符串,开发环境一般我们都是连接的测试库 ...

  8. PATH环境变量和CLASSPATH环境变量详解

    大凡装过JDK的人都知道要安装完成后要设置环境变量,可是为什么要设置环境变量呢?环境变量有什么作用? 1)PATH详解: 计算机安装JDK之后,输入“javac”“java”之类的命令是不能马上被计算 ...

  9. Hyperledger Fabric 通道配置文件和容器环境变量详解

    摘要 Fabric 网络启动的过程中需要进行大量配置,新学时对各个配置的作用一无所知,这导致我曾在网络出问题时先对配置文件的内容进行排列组合后再祈祷它能在某个时刻顺利运行,因此掌握 fabric 各个 ...

随机推荐

  1. ASP.NET Core Web API 最小化项目

    ASP.NET Core中默认的ASP.NET Core 模板中有Web API 模板可以创建Web API项目. 有时,只需要创建一个API,不需要关心Razor,本地化或XML序列化.通过删除无用 ...

  2. man ssh翻译(ssh命令中文手册)

    本文为命令ssh的man文档翻译,翻译了90%的内容,剩余是一些没必要翻译的东西,请见谅. 如此文有所疑惑,希望我的另一篇文章能解惑: SSH(1)                    BSD Ge ...

  3. 简单总结几种常见web攻击手段及其防御方式

    web攻击手段有几种,本文简单介绍几种常见的攻击手段及其防御方式 XSS(跨站脚本攻击) CSRF(跨站请求伪造) SQL注入 DDOS XSS 概念 全称是跨站脚本攻击(Cross Site Scr ...

  4. usaco training 4.2.2 The Perfect Stall 最佳牛栏 题解

    The Perfect Stall题解 Hal Burch Farmer John completed his new barn just last week, complete with all t ...

  5. 中文里带半角空格导致的Text换行问题[Unity]

    0x01 问题 最近策划反映了个问题,游戏里的多行文本会出现提前换行的问题,如下图所示: 文本错误地提前换行,导致第一行文本后面有大块空白区域 通过观察可以发现,当字符串中带有半角空格,且半角空格后面 ...

  6. mysql sql 基础总结

    1 mysql top n使用 select * from table limit n; 2    统配符使用必须和like结合使用 like % 通配符 描述 % 替代一个或多个字符 _ 仅替代一个 ...

  7. Android - AIDL 使用

    AIDL(Android Interface Definition Language) 程序员可以利用AIDL自定义编程接口,在客户端和服务端之间实现进程间通信(IPC).在Android平台上,一个 ...

  8. 关于华为P9手机的解锁、刷Recovery、获取Root、安装Busybox,以及升级降级的全过程(和一些错误的解决方法)

    我有一部华为P9手机,型号EVA-TL00,属于移动定制机.用了半年多了,想给手机添加一些功能,发现有些功能必须Root之后才能用代码实现,所以动了Root的打算. 一.手机解锁.(不解锁则无法对手机 ...

  9. (转)使用BigDecimal进行精确运算

    场景:在进行支付业务的金额计算时,通常采用BigDecimal类型的数据,并没有看到常见的int double类型,所以有必要好好学习下BigDecimal的常用用法. 1 误区 首先我们先来看如下代 ...

  10. 【流量】netflow 基础知识

    摘要 记录下关于netflow的基础知识以及应用,现状 是什么 一种数据交换方式,NetFlow流量统计数据包括数据流时戳 源IP地址和目的IP地址 源端口号和目的端口号 输入接口号和输出接口号 下一 ...