文章同步发表在博主网站朗度云,传输门: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. 主流手持设备GPU性能比较

    设备 GPU CPU 每秒像素填充率 每秒三角形生成 内存 iPhone4 PowerVR SGX 535 ARM Cortex-A8 800M     512M iPod touch 4 Power ...

  2. Golang学习 - unsafe 包

    ------------------------------------------------------------ 指针类型: *类型:普通指针,用于传递对象地址,不能进行指针运算. unsaf ...

  3. mysql官方示例数据库

    employees数据库:http://ari.iteye.com/blog/1066690  https://launchpad.net/test-db/employees-db-1/1.0.6

  4. servlet 和filter 抛出404等异常

    1. servlet抛出错误代码异常,如404 public void doGet(HttpServletRequest request, HttpServletResponse response) ...

  5. 添加IFrame导致内存溢出的解决过程(IE浏览器,目前发现了原因,还未解决)

    1.  现象 每次动态添加iframe时,iexplore.exe进程占据的内存都会增加(大概10M左右),不会自动释放,最终导致内存溢出 2.  解决过程 经过网络的一番搜索,基本上给出的解决方案是 ...

  6. Tika

    1.解析图片 @Test public void test1Image() throws IOException, SAXException, TikaException{ String filePa ...

  7. FVDI Commander products be replaced SVDI tools,really?

    You may have heard that some FVDI Commander products are being replaced by the new SVDI tools. This ...

  8. [Windows] 解决kmplayer播放rmvb文件音视不同步

    1. 到該帖子 http://www.kmplayer.com/forums/showthread.php?t=8755 下載附件中的4個檔案放到KMP 根 目錄下(此文件已在附件中上传) 2.於KM ...

  9. jQery简单Tab选项卡效果

    简单的Tab效果 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...

  10. iOS 画图讲解

    5.画图 (1)画线 //绘图代码写在drawRect里,view加载完成,需要显示的时候调用 //1.获取图形上下文 2.创建路径 3.把图形放入上下文 4.渲染上下文 //drawRect的rec ...