zoukankan      html  css  js  c++  java
  • 环境配置文件 ① /etc/profile、② ~/.bash_profile、③ ~/.bashrc、④ /etc/bashrc

    7.1.2  有效期与环境配置文件

    1.有效期
    默认情况下,在shell下的用户变量、alias等,只在此次登录中有效。一旦关闭终端或注销后,则将会设置恢复初始值。
    用户可以将这些设置放入一个系统环境配置文件中,使其长期生效。
    每一个用户都有一个登录Shell,且默认为bash,当用户打开一个bash时,系统就去读取~/.bashrc配置文件。因此可以将相关的用户设定放入此文件中。
    2.环境配置文件
    bash会在用户登录时,读取下列四个环境配置文件:
    全局环境变量设置文件:/etc/profile、/etc/bashrc。
    用户环境变量设置文件:~/.bash_profile、~/.bashrc。
    读取顺序:① /etc/profile、② ~/.bash_profile、③ ~/.bashrc、④ /etc/bashrc。
    ① /etc/profile:此文件为系统的每个用户设置环境信息,系统中每个用户登录时都要执行这个脚本,如果系统管理员希望某个设置对所有用户都生效,可以写在这个脚本里,该文件也会从/etc/profile.d目录中的配置文件中搜集shell的设置。
    ② ~/.bash_profile:每个用户都可使用该文件设置专用于自己的shell信息,当用户登录时,该文件仅执行一次。默认情况下,他设置一些环境变量,执行用户的.bashrc文件。
    ③ ~/.bashrc:该文件包含专用于自己的shell信息,当登录时以及每次打开新shell时,该文件被读取。
    ④ /etc/bashrc:为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取。

    +++++++++++++++++++++++++++++++++++
    http://blog.sina.com.cn/s/blog_9309820701018naw.html



    关于登录linux时,/etc/profile、~/.bash_profile等几个文件的执行过程。

    在登录Linux时要执行文件的过程如下:
    在 刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login或 ~/.profile文件中的其中一个,执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile。如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc文件。因为在 ~/.bash_profile文件中一般会有下面的代码:

    if [ -f ~/.bashrc ] ; then
     . ./bashrc
               fi
      ~/.bashrc中,一般还会有以下代码:
    if [ -f /etc/bashrc ] ; then
     . /etc/bashrc
    fi

    所以,~/.bashrc会调用 /etc/bashrc文件。最后,在退出shell时,还会执行 ~/.bash_logout文件。

    执 行顺序为:/etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc ->/etc/bashrc -> ~/.bash_logout

    关于各个文件的作用域,在网上找到了以下说明:
    (1)/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。

    (2)/etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取。

    (3)~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件。

    (4)~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

    (5)~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc /profile中的变量,他们是"父子"关系。

    (6)~/.bash_profile 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

    我 做了个实验,在/etc/profile,/etc/bashrc,~/.bashrc和~/.bash_profile文件的最后追加同一个变量分别赋 予不同的值,实验结果表明变量最后的值为~/.bash_profile里的值。(4个文件都没有修改其他设置,都是安装系统后的默认值。)
    再有就是4个文件都追加一个值到同一个文件,开机后查看该文件内容的顺序为:
    /etc/profile
    ~/.bash_profile
    ~/.bashrc
    /etc/bashrc

    ----------------------
    其他文章:
    redhat bash 初始化设置

    先说明三个概念

     

    登录shell

    正常登录程序启动的shell.既登录成功后紧接着给登录用户启动的shell.

     

    非登录交互式shell

    这个shell的工作方式是交互式的,等用户输入,然后执行,再等用户输入。显然登录shell就是一个交互式shell。

    如下,我们可获得一个交互式非登录shell:

    [root@localhost ~]# bash
    [root@localhost ~]# pwd
    /root

     

    非交互式shell

    为运行一个shell脚本启动的shell.

     

    以FC5的bash为例,跟shell环境配置相关的文件以下几个,

     

    /etc/profile
    /etc/profile.d/*.sh
    /etc/bashrc
    ~/.bash_profile
    ~/.bashrc

     

    有时你会发现定义一个别名,有时好像在任意一个文件里定义都可以起作用,有时好像又不起作用,那是为什么呢?这些配置文件各自互责了什么工作?相互的关系是怎么样的?跟前面介绍的不同种类的shell的关系是如何的呢?下面对每个文件单独进行说明。

     

    /etc/profile


    Linux规定,当启动一个登录shell会执行这个脚本. 测试过程如下:

    把LIST的定义加到/etc/profile文件的未尾并保存. 如下:
    alias LIST='ls -l'

    把所有其它shell配置文件或目录改名,这样系统就找不到那些shell脚本了,不会执行,重而避免其它配置文件的干扰。如下:
    [root@localhost ~]# mkdir /etc/profile.bak
    [root@localhost ~]# mv /etc/profile.d/* -t /etc/profile.bak/
    [root@localhost ~]# mv /etc/bashrc /etc/bashrc.bak
    [root@localhost ~]# mv ~/.bash_profile ~/.bash_profile.bak
    [root@localhost ~]# mv ~/.bashrc ~/.bashrc.bak


    交互式shell,并测试过程如下:

    [root@localhost ~]# bash
    bash-3.1# LIST
    bash: LIST: command not found
    bash-3.1# exit
    exit
    [root@localhost ~]#

    显然启动一个普通交互式shell的时候, shell配置文件/etc/profile不起作用

    非交互式shell, 测试过程如下:

    为了验证先写一个测试脚本,如下:

    #!/bin/bash
    LIST

    把这个脚本保存为t.sh并加下可执行权限:
    [root@localhost ~]# chmod a x t.sh
    [root@localhost ~]# ./t.sh       
    ./t.sh: line 2: LIST: command not found
    [root@localhost ~]#
    显然启动一个非交互式shell时,shell配置文件/etc/profile不起作用


    登录shell,并测试过程如下:
    Last login: Wed Nov 19 10:22:23 2008 from 192.168.0.97
    -bash-3.1# LIST
    total 160
    drwxr-xr-x  2 root root  4096 Aug 14 12:24 Desktop
    -rw-r--r--  1 root root  3211 Nov  6 10:15 Session.vim
    drwxr-xr-x  2 root root  4096 Nov 10 10:58 a
    -rw-r--r--  1 root root   126 Nov 12 12:42 a.txt
    -rw-r--r--  1 root root   261 Nov  6 15:23 a.zip
    -rw-r--r--  1 root root   157 Nov  6 15:23 aa.zip
    -rw-------  1 root root  1054 Aug 14 11:59 anaconda-ks.cfg
    -rw-r--r--  1 root root   691 Nov 18 10:09 b.txt
    -rw-r--r--  1 root root 31671 Aug 14 11:58 install.log
    -rw-r--r--  1 root root  4155 Aug 14 11:50 install.log.syslog
    -rw-------  1 root root 20310 Nov 17 13:51 mbox
    drwxr-xr-x  2 root root  4096 Nov 17 17:22 shell
    -rwxrwxrwx  1 root root    65 Nov 19 10:11 t.sh
    drwxr-xr-x 14 root root  4096 Nov  5 15:34 test
    -bash-3.1#
    显然启动一个登录shell时,shell配置文件/etc/profile会起作用

     

    ~/.bash_profile


    这个文件跟/etc/profile起作用的时机是一样的,都是只在启动一个登录shell的时候才会被source,跟/etc/profile不同的是,这里的配置只影响单个用户,不对其它用户产生影响。

     

    /etc/bashrc与~/.bashrc
    从字面上我们可以理解这两个文件应该跟根bash相关,即 只要你启动了一个bash类型的shell这两文件的配置就将发生作用。如果你的shell是sh、csh或是ksh这两个文件将不起作用。按前面的介 绍,可能很会猜测/etc/bashrc与~/.bashrc的关系跟/etc/profile与~/.bash_profile的关系一样,一个是全局 的,一个是针对单个用户的。从结果上看确实是这样的,但实现过程却是不一样的。启动一个bash时直接source ~/.bashrc, 而这~/.bashrc里面会source /etc/bashrc。

     

    /etc/profile.d/*.sh


    在fc5下这里的脚本会在/etc/profile里或是~/.bashrc里同时source, 所以这里的设置都是一些不同分类的全局环境设置。

     

     

    总结在FC5下一个登录bash的环境初始全过程是:

    /etc/profile
        |
        --/etc/profile.d/*
    ~/.bash_profile
        |
        --~/.bashrc
                 |
                 --/etc/bashrc
                     |
                     --/etc/profile.d/*

    一个普通交互式bash的初始全过程是:
    ~/.bashrc
        |
        --/etc/bashrc
           |
           --/etc/profile.d/*

    对于非交互式bash的初始全过程是:
     不重新source 任何新的shell脚本,只继承当前shell的设置.




    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(1143) | 评论(0) | 转发(2) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    Android开发探秘之一:创建可以点击的Button
    TCP之心跳包实现思路
    Asp.net与Dojo交互:仪器仪表实现
    Asp.net Json数据解析的一种思路
    Asp.net通过Jquery操作WebService进行Ajax读写
    GridView自定义删除操作
    从客户端中检测到有潜在危险的request.form值
    JUC-Condition线程通信
    ModelAndView 配置与使用
    SpringMVC之ModelAndView的用法(转)
  • 原文地址:https://www.cnblogs.com/ztguang/p/12648697.html
Copyright © 2011-2022 走看看