zoukankan      html  css  js  c++  java
  • ubuntu中环境变量文件/etc/profile、.profile、.bashrc、/etc/bash.bashrc之间的区别和联系

    写在前面:不同的发行版里面文件的命名可能有所不同,如有的发行版etc目录下有bashrc,有的发行版下面是bash.bashrc。这个根据每个人不同的发行版注意下具体的文件名称。

    /etc/profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置.所以如果你有对/etc/profile有修改的话必须得重启你的修改才会生效,此修改对每个用户都生效。可以通过命令source /etc/profile立即生效

    /etc/bashrc或/etc/bash.bashrc:为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.如果你想对所有的使用bash的用户修改某个配置并在以后打开的bash都生效的话可以修改这个文件,修改这个文件不用重启,重新打开一个bash即可生效。

    ~/.bash_profile或~/.profile :每个用户都可使用该文件输入专用于当前用户使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件.
    此文件类似于/etc/profile,也是需要需要重启才会生效,/etc/profile对所有用户生效,~/.bash_profile只对当前用户生效。

    ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取.(每个用户都有一个.bashrc文件,在用户目录下)。此文件类似于/etc/bashrc或/etc/bash.bashrc,不需要重启生效,重新打开一个bash即可生效,  /etc/bashrc或/etc/bash.bashrc对所有用户新打开的bash都生效,但~/.bashrc只对当前用户新打开的bash生效。

    另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是"父子"关系.


    要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是login shell 和non-login shell。
    交互式模式就是shell等待你的输入,并且执行你提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当你签退后,shell也终止了。 shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。
    bashrc与profile都用于保存用户的环境信息,bashrc用于交互式non-loginshell,而profile用于交互式login shell。

    交互式的:顾名思义,这种shell中的命令时由用户从键盘交互式地输入的,运行的结果也能够输出到终端显示给用户看。例如我们平常在终端输入的cd命令、vi命令、mv等都属于交互式的。

    非交互式的:这种shell可能由某些自动化过程启动,不能直接从请求用户的输入,也不能直接输出结果给终端用户看。通常我们写的shell脚本都是非交互式的,通过sh 直接运行该脚本文件。

    login的:意思是这种是在某用户由/bin/login登陆进系统后启动的shell,跟这个用户绑定。这个shell是用户登陆后启动的第一个进程。login进程在启动shell时传递第0个参数指明shell的名字,该参数第一个字符为"-",指明这是一个login shell。比如对bash而言,启动参数为"-bash"。当bash以login shell启动时,它会执行/etc/profile中的命令,然后/etc/profile调用/etc/profile.d目录下的所有脚本;然后执行~/.profile,~/.profile调用~/.bashrc,最后~/.bashrc又调用/etc/bash.bashrc。
    要识别一个shell是否为login shell,只需在该shell下执行echo $0:
    # echo $0
    如果输出为该shell名字,加上一个'-'前缀,则说明该shell为login shell。例如-bash,-su等等。实验一下,在本人的Ubuntu系统下,打开Terminal,输入echo $0,得到的是"bash",说明这不是一个login shell。而切换到root用户下,执行同样命令,得到了"-su"的结果,说明由su登录的为login shell。


    非login的:不需login而由某些程序启动的shell。传递给shell的参数,是没有'-'前缀的。还以Bash为例,当以非login方式启动时,它会调用~/.bashrc,随后~/.bashrc中调用/etc/bashrc,最后/etc/bashrc调用所有/etc/profile.d目录下的脚本。这个有兴趣的可以打开这些文件看一看。非login的shell主要包括以"#su","#su USERNAME"启动的shell,和图形终端(例如Ubuntu的Terminal),执行的脚本等等。识别非login的shell方法还是执行#echo $0命令,得到的结果如果没有'-'前缀,即为非login的。

    参考:https://blog.csdn.net/wang_xijue/article/details/46820043

  • 相关阅读:
    链表--判断一个链表是否为回文结构
    矩阵--“之”字形打印矩阵
    二叉树——平衡二叉树,二叉搜索树,完全二叉树
    链表--反转单向和双向链表
    codeforces 490C. Hacking Cypher 解题报告
    codeforces 490B.Queue 解题报告
    BestCoder19 1001.Alexandra and Prime Numbers(hdu 5108) 解题报告
    codeforces 488A. Giga Tower 解题报告
    codeforces 489C.Given Length and Sum of Digits... 解题报告
    codeforces 489B. BerSU Ball 解题报告
  • 原文地址:https://www.cnblogs.com/perfy/p/10398105.html
Copyright © 2011-2022 走看看