shell的运行方式与环境变量加载

linux

Posted by jiang on September 19, 2020

shell运行模式

  • Bash有几种不同的运行模式,login shell与non-login shell,interactive shell与non-interactive shell

login shell

  • 清除掉所有变量,通过文件重新读入

系统加载(主动)

  • 第二步按顺序加载找到第一个为止
  1. /etc/profile
  2. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile

脚本加载(被动)

  • profie.d文件夹、bashrc、.bashrc都是通过脚本加载
  • /etc/profile ==> /etc/profile.d/*
  • ~/.bash_profile ==>~/.bashrc ==> /etc/bashrc

一般加载步骤

  1. /etc/profile
  2. /etc/profile.d/*
  3. ~/.bash_profile 或 ~/.bash_login 或 ~/.profile
  4. ~/.bashrc
  5. /etc/bashrc

登录方式

  • ssh登录(交互)
  • 本地用户名与密码登录(交互)
  • 终端bash –login选项(非交互)
  • 用户切换 su - jiang (交互)

non-login shell

  • 继承上一个shell的全部变量

系统加载(主动)

  • ~/.bashrc (su Jiang) (bash)

脚本加载(被动)

  • ~/.bashrc ==> /etc/bashrc ==> /etc/profile.d/*

一般加载步骤

  1. ~/.bashrc
  2. /etc/bashrc
  3. /etc/profile.d/*

非登录方式

  • 执行脚本 bash *.sh (非交互)
  • 终端 bash (交互)
  • 用户切换su Jiang (交互)
  • 在Gnome或KDE中打开一个终端程序(交互)

系统shell切换

  • chsh -s /bin/bash
  • zsh下 ~/.bash_profile ==> ~/.bashrc ==> /etc/bashrc 不会执行

判断当前shell状态

1
2
3
4
shopt |grep login_shell

# himBH交互式 hb非交互
echo $-

脚本加载相关代码

  • /etc/profile.d加载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 位于/etc/profile文件
for i in /etc/profile.d/*.sh /etc/profile.d/sh.local ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then 
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

# 位于/etc/bashrc文件
for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        if [ "$PS1" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

  • ~/.bashrc加载
1
2
3
4
5
#位于~/.bash_profile文件
if [ -f ~/.bashrc ]; then
	. ~/.bashrc
fi

  • /etc/bashrc加载
1
2
3
4
5
# 位于~/.bashrc文件
if [ -f /etc/bashrc ]; then
	. /etc/bashrc
fi