Linux之/etc/profile、~/.bash_profile等几个文件的执行过程
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之/etc/profile、~/.bash_profile等几个文件的执行过程
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2023-08-04 08:56:27
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!