Linux 登录时,要执行文件的过程如下:

在刚登录Linux时,首先启动 /etc/profile 文件,然后再启动用户目录下的 ~/.bash_profile、 ~/.bash_login、~/.profile 文件中的一个,

执行的顺序为:~/.bash_profile、 ~/.bash_login、 ~/.profile

如果 ~/.bash_profile文件存在的话,一般还会执行 ~/.bashrc 以及 /etc/bashrc 文件。

因为在 ~/.bash_profile文件中一般会有下面的代码:

vim ~/.bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

 

~/.bashrc中,一般还会有以下代码:

vim ~/.bashrc

# Source global definitions
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

Welcome to Alibaba Cloud Elastic Compute Service !

/etc/profile         +++ whoami 111 = mimvp
/etc/bashrc          +++ whoami 111 = mimvp
mimvp /home/mimvp/.bashrc         +++ whoami 111 = mimvp
mimvp /home/mimvp/.bash_profile   +++ whoami 111 = mimvp
/etc/bashrc          +++ whoami 111 = root
root /root/.bashrc   +++ whoami 111 = root
/etc/profile         +++ whoami 111 = root

关于各个文件的作用域,在网上找到了以下说明:

1)/etc/profile

此文件为系统的每个用户设置环境信息和启动程序,当用户第一次登录时,该文件被执行. 并从/etc/profile.d/目录的配置文件中搜集shell的设置。其配置对所有登录的用户都有效。当被修改时,必须重启才会生效。英文描述:”System wide environment and startup programs, for login setup.”。另外 /etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。

2)~/.bash_profile

为当前用户设置专属的环境信息和启动程序,每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,设置一些环境变量,执行用户的.bashrc文件。理念类似于 /etc/profile,只不过只对当前用户有效,也需要重启才能生效。注意:Centos7系统命名为.bash_profile,其他系统可能是.bash_login或.profile

3)~/.bashrc

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取执行。理念类似于/etc/bashrc,只不过只对当前用户有效,不需要重启,只需要打开新的shell即可生效。

4)/etc/bashrc

为每一个运行bash shell的用户执行此文件,当 bash shell 打开时,该文件被执行,其配置对所有使用bash的用户打开的每个bash都有效。当被修改后,不用重启只需要打开一个新的 bash 即可生效。英文描述:”System wide functions and aliases.”

5)~/.bash_logout

当每次退出系统(退出bash shell)时,执行该文件,可以把一些清理工作的命令放进这个文件。

# cat ~/.bash_logout 
# ~/.bash_logout

6)~/.bash_history

保留了最近1000条bash shell执行的历史命令记录,最大保存1000条,且是上次注销前最近的1000条记录,查看历史记录条数 echo $HISTSIZE,默认是1000,在配置文件 /etc/profile 文件中配置,为了安全可以减少历史记录条数为 300,即修改 vim /etc/profile 里的变量  HISTSIZE=300,或者为了增加记录条数,修改其 HISTSIZE=10000

7)/etc/profile.d/

此文件夹里是除/etc/profile之外其他的”application-specific startup files”。英文描述为”The /etc/profile file sets the environment variables at startup of the Bash shell. The /etc/profile.d directory contains other scripts that contain application-specific startup files, which are also executed at startup time by the shell.” 同时,这些文件”are loaded via /etc/profile which makes them a part of the bash “profile” in the same way anyway.” 因此可以简单的理解为是/etc/profile的一部分,只不过按类别或功能拆分成若干个文件进行配置了(方便维护和理解)

# ll /etc/profile.d/
total 60
-rw-r--r--. 1 root root 1127 Jun 20  2014 colorls.csh
-rw-r--r--. 1 root root 1143 Jun 20  2014 colorls.sh
-rw-r--r--. 1 root root   92 Nov 22  2013 cvs.csh
-rw-r--r--. 1 root root   78 Nov 22  2013 cvs.sh
-rw-r--r--  1 root root  192 Sep 10  2014 glib2.csh
-rw-r--r--  1 root root  192 Sep 10  2014 glib2.sh
-rw-r--r--. 1 root root 1741 Jul 10  2014 lang.csh
-rw-r--r--. 1 root root 2706 Jul 10  2014 lang.sh
-rw-r--r--. 1 root root  122 Feb  7  2007 less.csh
-rw-r--r--. 1 root root  108 Feb  7  2007 less.sh
-rw-r--r--  1 root root  976 Sep 24  2011 qt.csh
-rw-r--r--  1 root root  912 Sep 24  2011 qt.sh
-rw-r--r--. 1 root root   97 Apr  5  2012 vim.csh
-rw-r--r--. 1 root root  269 Apr  5  2012 vim.sh
-rw-r--r--. 1 root root  169 May 20  2009 which2.sh

注意事项

1)以上需要重启才能生效的文件,其实可以通过 source /etc/xxx 暂时生效。

2)文件的执行顺序为:当登录Linux时,首先启动/etc/environment和/etc/profile,然后启动当前用户目录下的/.bash_profile,执行此文件时一般会调用/.bashrc文件,而执行/.bashrc时一般会调用/etc/bashrc,最后退出shell时,执行/.bash_logout。

简单来说顺序为:(登录时)/etc/environment –> /etc/profile(以及/etc/profile.d/里的文件) –> ~/.bash_profile –> (打开shell时)~/.bashrc –> /etc/bashrc –> (退出shell时)~/.bash_logout

 

 

/etc/profile 和 /etc/environment 等各种环境变量设置文件的用处

1)先将export LANG=zh_CN加入/etc/profile,退出系统重新登录,登录提示显示英文。

2)先将/etc/profile 中的export LANG=zh_CN删除,将LNAG=zh_CN加入/etc/environment,退出系统重新登录,登录提示显示中文。

用户环境建立的过程中总是先执行/etc/profile,然后再读取/etc/environment。为什么会有如上所叙的不同呢?而不是先执行/etc/environment,后执行/etc/profile呢?

这是因为:/etc/environment是设置整个系统的环境,而/etc/profile是设置所有用户的环境,前者与登录用户无关,后者与登录用户有关。

系统应用程序的执行与用户环境可以是无关的,但与系统环境是相关的,所以当你登录时,你看到的提示信息,如日期、时间信息的显示格式与系统环境的LANG是相关的,缺省LANG=en_US,如果系统环境LANG=zh_CN,则提示信息是中文的,否则是英文的。

对于用户的 shell 初始化而言是先执行/etc/profile,再读取文件/etc/environment;对整个系统而言是先执行/etc/environment。这样理解正确吗?

登陆系统时的顺序应该是

/etc/enviroment --> /etc/profile --> $HOME/.profile -->$HOME/.env (如果存在)

/etc/profile 是所有用户的环境变量

/etc/enviroment 是系统的环境变量

 

登陆系统时 shell 读取的顺序应该是

/etc/profile -> /etc/enviroment --> $HOME/.profile --> $HOME/.env

原因应该是用户环境和系统环境的区别了,如果同一个变量在用户环境(/etc/profile)和系统环境(/etc/environment)有不同的值,那应该是以用户环境为准了。

 

 

CentOS 7 系统中的 /etc/profile 不生效

/etc/profile 文件是每一个用户登录时,操作系统首先执行的文件,然后再将控制权交给用户目录下的 ~/.bashrc 文件

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

执行顺序为:(登录时)/etc/environment –> /etc/profile(以及/etc/profile.d/里的文件) –> ~/.bash_profile –> (打开shell时)~/.bashrc –> /etc/bashrc –> (退出shell时)~/.bash_logout

因此,CentOS 7系统中,在配置 /etc/profile 文件中设置的环境变量不生效时,可以考虑把环境变量设置到 ~/.bash_profile 或 ~/.bashrc 文件中

1)把环境变量设置到 ~/.bash_profile

# cat ~/.bash_profile    
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/bin
export PATH

#export PATH=/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
export PATH=/usr/local/bin:$PATH

export PHP_ROOT=/usr/local/php
export PATH=$PHP_ROOT/bin:$PATH

export NGINX_ROOT=/usr/local/nginx
export PATH=$NGINX_ROOT/sbin:$PATH


cd ~/script/

 

2)把环境变量设置到 ~/.bashrc

# cat ~/.bashrc 
# .bashrc

# User specific aliases and functions

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi

#export PATH=/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin
export PATH=/usr/local/bin:$PATH

export PHP_ROOT=/usr/local/php
export PATH=$PHP_ROOT/bin:$PATH

export NGINX_ROOT=/usr/local/nginx
export PATH=$NGINX_ROOT/sbin:$PATH

 

 

参考推荐:

Linux/bin,/sbin,/usr/bin,/usr/sbin区别

Linux crond 不执行原因分析

Linux shell 局部变量与全局变量

CentOS 搭建 SVN Server

在命令行快速切换目录

 

原文 Linux之/etc/profile、~/.bash_profile等几个文件的执行过程