目录

一、Shell的四种启动方式

1、判断 Shell 是否是交互式

2、判断 Shell 是否为登录式

3、同时判断交互式、登录式

二、Shell配置文件(配置脚本)的加载

1、登录式的 Shell

2、非登录的 Shell

三、编写自己的Shell配置文件

一、Shell的四种启动方式

Shell 一共有四种运行方式:交互式的登录 Shell、交互式的非登录 Shell、非交互式的登录 Shell、

非交互式的非登录 Shell。

1、判断 Shell 是否是交互式

判断是否为交互式 Shell 有两种简单的方法。

1) 查看变量-的值,如果值中包含了字母i,则表示交互式(interactive)。

【实例1】在终端下输出-的值:

[root123@localhost addon]$ echo $-
himBH   # 包含了i,为交互式。

【实例2】在 Shell 脚本文件中输出-的值:

[root123@localhost addon]$ cat test.sh    
#!/bin/bash
echo $-
[root123@localhost addon]$ bash test.sh 
hB        # 非交互式

不包含i,为非交互式。注意,必须在新进程中运行 Shell 脚本。

2) 查看变量PS1的值,如果非空,则为交互式,否则为非交互式,因为非交互式会清空该变量。

【实例1】在自带的终端下输出 PS1 的值:

[root123@localhost addon]$ echo $PS1
[\u@\h \W]\$   # 非空,为交互式。

2、判断 Shell 是否为登录式

判断 Shell 是否为登录式也非常简单,只需执行shopt login_shell即可,值为on表示为登录式,off为非登录式。

[root123@localhost addon]$ shopt login_shell
login_shell     on

3、同时判断交互式、登录式

要同时判断是否为交互式和登录式,可以简单使用如下的命令:

[root123@localhost addon]$ echo $PS1; shopt login_shell
[\u@\h \W]\$
login_shell     on

或者

echo $-; shopt login_shell

二、Shell配置文件(配置脚本)的加载

无论是否是交互式,是否是登录式,Bash Shell 在启动时总要配置其运行环境,例如初始化环境变量、设置命令提示符、指定系统命令路径等。这个过程是通过加载一系列配置文件完成的,这些配置文件其实就是 Shell 脚本文件。

与 Bash Shell 有关的配置文件主要有 /etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc、/etc/bashrc、/etc/profile.d/*.sh,不同的启动方式会加载不同的配置文件。

1、登录式的 Shell

Bash 官方文档说:如果是登录式的 Shell,首先会读取和执行 /etc/profiles,这是所有用户的全局配置文件,接着会到用户主目录中寻找 ~/.bash_profile、~/.bash_login 或者 ~/.profile,它们都是用户个人的配置文件。

不同的 Linux 发行版附带的个人配置文件也不同,有的可能只有其中一个,有的可能三者都有,笔者使用的是 CentOS 7,该发行版只有 ~/.bash_profile,其它两个都没有。

如果三个文件同时存在的话,到底应该加载哪一个呢?它们的优先级顺序是~/.bash_profile > ~/.bash_login > ~/.profile。

如果 ~/.bash_profile 存在,那么一切以该文件为准,并且到此结束,不再加载其它的配置文件。

如果 ~/.bash_profile 不存在,那么尝试加载 ~/.bash_login。~/.bash_login 存在的话就到此结束,不存在的话就加载 ~/.profile。

注意,/etc/profiles 文件还会嵌套加载 /etc/profile.d/*.sh,请看下面的代码:

for i in /etc/profile.d/*.sh ; do
    if [ -r "$i" ]; then
        if [ "${-#*i}" != "$-" ]; then
            . "$i"
        else
            . "$i" >/dev/null
        fi
    fi
done

同样,~/.bash_profile 也使用类似的方式加载 ~/.bashrc

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

2、非登录的 Shell

如果以非登录的方式启动 Shell,那么就不会读取以上所说的配置文件,而是直接读取 ~/.bashrc

~/.bashrc 文件还会嵌套加载 /etc/bashrc,请看下面的代码:

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

三、编写自己的Shell配置文件

对于普通用户来说,也许 ~/.bashrc 才是最重要的文件,因为不管是否登录都会加载该文件。

我们可以将自己的一些代码添加到 ~/.bashrc,这样每次启动 Shell 都可以个性化地配置。

当用户登录 Shell 时,PATH 变量会在 /etc/profile 文件中设置,然后在 ~/.bash_profile 也会增加几个目录。如果没有登录 Shell,PATH 变量会在 /etc/bashrc 文件中设置。

如果我们想增加自己的路径,可以将该路径放在 ~/.bashrc 文件中,例如:

export PATH="$PATH:$HOME/addon"

将主目录下的 addon 目录也设置为系统路径。假如此时在 addon 目录下有一个 getsum 程序,它的作用是计算从 m 累加到 n 的和,那么我们不用 cd 到 addon 目录,直接输入 getsum 命令就能得到结果。

source  ~/.bashrc

注意,使用 source 命令,使修改的配置立刻生效

操作过程:

[root123@localhost addon]$ cat ~/.bashrc
# .bashrc

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

# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=

# User specific aliases and functions

export PATH="$PATH:$HOME/addon"
 
[root123@localhost addon]$ source  ~/.bashrc
[root123@localhost addon]$ getsum -s 1 -e 100
5050