目录
一、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