文章同步发表在博主网站朗度云,传输门:http://www.wolfbe.com/detail/201608/278.html

在Linux系统上,我们会看到类似于profile和bashrc的文件,以用户名wolfbe为例,讲解这些文件的位置及作用。对于某一个用户,一般存在以下的文件:
/etc/profile;
/etc/bashrc 或 /etc/bash.bashrc;
/home/wolfbe/.profile;
/home/wolfbe/.bashrc;
/home/wolfbe/.bash_profile;(这文件在某些系统不一定存在)
/home/wolfbe/.bash_login;(这些文件在某些系统不一定存在)
 
其实,上面的这些文件都是保存用户环境信息的配置文件,在shell启动时被shell读取。区别在于/etc/profile与/etc/bashrc保存的信息是全局的,作用于所有的用户,/home/username下的配置信息是针对某个用户的,只对某个用户有效。为了彻底弄清楚profile与bashrc的作用,我们需要了解shell的运行模式。
 
bash是linux系统的一种常用的shell,它有几种不同的运行模式:
login shell;
non-login shell;
interactive shell;
non-interactive shell;(非交互式,如执行shell脚本)
通过不同的方式可以进入不同的shell的运行模式,如下:
  • 登录系统时,获得的是一种交互式的login shell;
  • 在终端下使用--login参数调用bash时,获得的是交互式的login shell,如果不加--login参数,则获得的是交互式的non-login shell;
  • 在脚本中使用--login选项调用bash时,获得的是非交互式的login shell(如#! /bin/bash),如果不加--login选项,则获得的是非交互式的non-login shell;
  • 使用su -切换用户时,获得的是交互式的login shell,如果不加"-"获得的是交互式的non-login shell。
 
login shell与non-login shell的主要区别在于启动时读取不同的配置文件,从而导致环境不同。
  • 交互式login shell启动时首先读取/etc/profile文件信息,一般会在/etc/profile加载/etc/bashrc文件,然后依次查找~/.bash_profile、~/.bash_login、~/.profile配置文件,并且读取找到的第一个且可读的文件,最后再读取~/.bashrc文件;login shell在退出时会读取~/.bash_logout文件;
  • 交互式non-login shell启动时首先读取/etc/bashrc文件,然后读取~/.bashrc文件;
  • 非交互式login shell启动时首先读取/etc/profile文件信息,但不会加载/etc/bashrc文件,然后依次查找~/.bash_profile、~/.bash_login、~/.profile配置文件,并且读取找到的第一个且可读的文件,但也不会再加载~/.bashrc文件;login shell在退出时会读取~/.bash_logout文件;
  • 非交互式non-login shell启动时不会读取上面的配置文件,而是找到环境变量BASH_ENV,并且读取BASH_ENV中指定的文件的命令;
 
由此可以知道,bashrc仅在交互式shell启动时被读取,profile仅在login shell启动进被读取。
 
下面通过一些例子来验证上面的说法,首先在上面的配置文件中都加入打印信息的代码:
 #/etc/profile
echo "invoke /etc/profile" #/etc/bash.bashrc
echo "invoke /etc/bash.bashrc" #~/.bashrc
echo "invoke .bashrc" #~/.profile
echo "invoke .profile" #~/.bash_logout
echo "invoke bash_logout"
 
为了测试非交互式的shell,新建三个shell文件,分别为login.sh、nologin.sh、bash_env.sh,并且在.profile后面加入环境变量BASH_ENV:
#! /bin/bash --login
echo "invoke login.sh" #! /bin/bash
echo "invoke nologin.sh" #! /bin/bash
echo "invoke bash_env.sh" #.profile后加入BASH_ENV
export BASH_ENV=/home/wolfbe/bash_env.sh #立即生效
source ./.profile
由于本linux系统上没有.bash_profile和.bash_login文件,所有只测试上面的几个文件。
 
1、测试交互式login shell启动:
$bash --login

invoke /etc/bash.bashrc
invoke /etc/profile
invoke .bashrc
invoke .profile $exit logout
invoke bash_logout
加载bashrc的文件和profile 的文件,由于bashrc文件都是包含在profile文件里面,所以bashrc信息先于profile文件显示出来。
 
2、测试交互式non-login shell启动:

$bash

invoke /etc/bash.bashrc
invoke .bashrc $exit exit
仅仅加载bashrc的文件,没有profile 的文件。
 
3、测试非交互式login shell启动:
$./login.sh

invoke /etc/profile
invoke .profile
invoke login.sh
仅仅加载profile的文件,没有bashrc的文件。
 
4、测试非交互式nologin shell启动:

$./nologin.sh

invoke bash_env.sh
invoke nologin.sh
可见先执行了bash_env.sh文件,即环境变量BASH_ENV指定的文件。
 
 
 

Linux中profile与bashrc的作用的更多相关文章

  1. Linux中profile、bashrc、bash_profile之间的区别和联系

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/pr ...

  2. (转) Linux中profile、bashrc、bash_profile之间的区别和联系

    原文地址:http://blog.csdn.net/chenchong08/article/details/7833242 /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登 ...

  3. 【转载】Linux中profile、bashrc、bash_profile之间的区别和联系

    如果你想对所有的使用bash的用户修改某个配置并在以后打开的bash都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个bash即可生效.~/.bash_profile:每个用户都可使用该文 ...

  4. 【转】Linux中profile、bashrc、bash_profile之间的区别和联系

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登陆时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置. 英文描述为: # /etc/pr ...

  5. Linux中profile和bashrc的区别

    profile主要设置系统环境参数(可类比为Windows的系统环境变量),如$PATH /etc/profile ~/.bash_profile bashrc主要用来设置bash命令,如命令别名,a ...

  6. Linux中PATH环境变量的作用和使用方法

    关于PATH的作用:PATH说简单点就是一个字符串变量,当输入命令的时候LINUX会去查找PATH里面记录的路径.比如在根目录/下可以输入命令ls,在/usr目录下也可以输入ls,但其实ls这个命令根 ...

  7. linux关于profile 、bashrc 、.bash_profile、.bashrc的区别

    linux关于profile .bashrc ..bash_profile..bashrc的区别 - /etc/profile /etc/bashrc ~/.bash_profile ~/.bashr ...

  8. linux中test与[ ]指令的作用

    linux中test与[ ]指令的作用: 在Linux中,test和[ ]功能是一样的,类似于c语言中的( ).不过Linux的test和[ ]是指令.在和if或者while联用时要用空格分开.

  9. Linux中的Wheel组的作用

    原文:http://www.360doc.com/content/11/0505/10/4644186_114496525.shtml Linux中的Wheel组的作用(用自己的话翻译的) (原文) ...

随机推荐

  1. 如何快速掌握CSS(各种CSS工具)

    CSS中的大量属性难以记忆,通过组合多种CSS工具,可以快速学习常见样式,并提高设计效率.这里给大家推荐一些比较好的在线工具,通过所见即所得图形化界面设计样式,直接得到对应的CSS代码.相比臃肿的集成 ...

  2. 548 - Tree (UVa OJ)

    Tree You are to determine the value of the leaf node in a given binary tree that is the terminal nod ...

  3. Android——AnimationDrawable 实现动画

    Android中的AnimationDrawable可以加载Drawable资源实现帧动画.实现步骤如下: 一.设置动画播放的帧资源 <?xml version="1.0" ...

  4. WPF之基于路径的动画

    不是突然想到要做一个路径动画的,是今天谈业务需求的时候偶然谈到的, 一艘船从一个国家到另外一个国家,沿着一条固定的路线前进,就是一个简单的动画效果,以前貌似在书上看到过,所以自己也来做一个. 在网上搜 ...

  5. Scrapy使用心得

    今天安装了大名鼎鼎的Scrapy,不过碰到了不少问题,包括"Unable to find vcvarsall.bat" 这个错误应该很常见的,用了最简单的解决方法: 安装visua ...

  6. sourcetree下回退

    上篇 最后展示了再命令行下回退的功能,再来看看sourcetree下如何操作 新建 新建文本文档.txt,添加一行"第一次“,并提交 1.添加一行"第二次",现在修改只在 ...

  7. 人体时钟hone hone clock

    摘要:一个由日本人设计的有意思的Flash时钟:人体时钟 hone hone clock .安装很简单,直接js导入即可,包括两种样式:透明背景和白色背景. 很可爱的一个设计,实现后效果如下: 使用方 ...

  8. C# 序列化JavaScriptSerializer

    1.首先引入 System.Web.Extensions.dll 2.写入命名空间 System.Web.Script.Serialization 3.实现序列化. class Program { s ...

  9. Html5新标签及用法

    HTML 5 是一个新的网络标准,目标在于取代现有的 HTML 4.01, XHTML 1.0 and DOM Level 2  HTML 标准.它希望能够减少浏览器对于需要插件的丰富性网络应用服务( ...

  10. bootstrap daterangepicker 添加阴历及节假日

    所有的新增都用 'myAdd start'和'myAdd end'标注,所有的修改都用'myChange start'和'myChange end'标注. 借用了 1900-2100区间内的公历.农历 ...