用户登录时的环境加载顺序

1.配置文件说明

系统级的配置文件

配置文件 描述
/etc/profile 系统级的全局配置文件,在用户登录时由Bash首先读取(如果是登录 shell)。
/etc/profile.d/* 这里面的脚本通常由/etc/profile调用,用于更灵活地进行系统级的环境变量设置和初始化任务等。
/etc/bashrc 为每一个运行bash shell的用户执行此文件,当bash shell被打开时,该文件被读取,有些linux版本中的/etc目录下已经没有了bashrc文件。

用户级的配置文件

配置文件 描述
~/.bash_profile 用户级的登录shell配置文件,如果存在,在用户登录时被读取。
~/.bash_login 如果~/.bash_profile不存在,Bash 会尝试查找这个文件作为用户级登录 shell 的配置文件。
~/.profile 如果前两者都不存在,就执行这个文件作为用户级登录shell的配置文件。
~/.bashrc 在某些情况下,如从登录shell启动一个新的交互式非登录shell,或者在~/.bash_profile(或其他登录shell配置文件)中显式调用时,这个文件会被读取执行,用于设置交互式非登录shell的环境和别名等。
~/.bash_login 是一个用户级的 Bash 配置文件,主要在用户退出Bash会话(尤其是交互式登录 shell 会话)时执行。

2.加载顺序

shell交互式登录

stateDiagram-v2 shell登录 –> /etc/profile /etc/profile –> /etc/profile.d/* /etc/profile.d/* –> HOME HOME –> ~/.bashrc : 被前序脚本触发 ~/.bashrc –> /etc/bashrc : 被前序脚本触发 ~/.bashrc –> shell退出 : shell退出 –> ~/.bash_logout : 被自动触发 state HOME { direction LR ~/.bash_profile –> ~/.bash_login : 不存在触发 ~/.bash_login –> ~/.profile : 不存在触发 }

非shell交互式登录

  • 1.如通过某些特殊方式启动非交互式shell并明确指定加载~/.bashrc
  • 2.或者从一个已经加载了~/.bashrc的交互式shell启动非交互式shell且有机制将当前环境传递给新的shell,可能会间接导致~/.bashrc的部分效果在非交互式shell中体现。

stateDiagram-v2 direction LR 非交互式shell –> ~/.bashrc : 有可能被加载 非交互式shell –> /etc/bashrc : 有可能被自动加载 ~/.bashrc –> /etc/bashrc : 有可能被前序脚本触发

3.示例

~/.bash_profile

#!/bin/bash

# ...其他内容

if [ -f ~/.bashrc ]; then
  . ~/.bashrc
fi

~/.bashrc

#!/bin/bash

# ...其他内容

if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
请登录后发表评论

    没有回复内容