zoukankan      html  css  js  c++  java
  • Linux中profile与bashrc的作用

    文章同步发表在博主网站朗度云,传输门: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指定的文件。
     
     
     
  • 相关阅读:
    java 日志框架的选择Log4j->SLF4j->Logback
    linux上的常用命令
    Zookeeper配置Kafka
    分布式日志收集框架Flume
    Spark Streaming简介
    Spring Cloud学习笔记之微服务架构
    IntelliJ IDEA学习记录
    firefox插件-自动化测试工具-selenium IDE
    大数据01
    使用java开发spark的wordcount程序(多种实现)
  • 原文地址:https://www.cnblogs.com/beyondfengyu/p/5819886.html
Copyright © 2011-2022 走看看