本篇文章演示“.”,sh,source,bash 执行脚本的区别
使用Centos7.6作为实验环境,实验前需要下载
pstree
命令,yum -y install psmisc
实验脚本如下:
[root@192 ~]# ll -d test.sh
-rw-r--r--. 1 root root 26 Dec 11 06:03 test.sh
[root@192 ~]# cat test.sh
#! /bin/bash
vmstat -n 1
1. 使用 “.” 执行脚本shell发生了什么?
使用 “
.
” 执行脚本脚本需要赋予脚本 可执行权限
使用echo $$ 查看当前shell进程号
[root@192 ~]# echo $$
11226
[root@192 ~]# chmod +x test.sh
[root@192 ~]# ./test.sh
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 673792 2068 126328 0 0 72 4 98 233 0 2 98 0 0
开启另一个终端使用pstree来观察脚本执行情况
[root@192 ~]# pstree -pca 11226
bash,11226
└─test.sh,44140 ./test.sh
└─vmstat,44141 -n 1
由此可以看出在执行 ./test.sh 时由本地bash启动一个test.sh
进程,test.sh进程又启动一个 vmstat
进程。
2. 使用sh 执行,shell发生了什么?
使用
sh
执行脚本时,不需要脚本又执行权限,但是一定要有可读权限,当前shell进程还是 11226
[root@192 ~]# sh test.sh
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 139120 0 652344 0 0 62 109 83 151 0 1 98 0 0
开启另一个终端使用pstree来观察脚本执行情况
[root@192 ~]# pstree -pca 11226
bash,11226
└─sh,39059 test.sh
└─vmstat,39060 -n 1
由此可以看出 sh test.sh 在执行脚本时,由本地shell bash
开启了一个子shell sh
,由子shell sh
在开启 vmstat
进程
3. 使用 source 执行,shell发生了什么?
[root@192 ~]# source test.sh
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 139212 0 652424 0 0 55 95 83 147 0 1 98 0 0
开启另一个终端使用pstree来观察脚本执行情况
[root@192 ~]# pstree -pca 11226
bash,11226
└─vmstat,44717 -n 1
由此可以看出使用source test.sh 执行脚本时,直接由本地shell进程开启一个子进程执行
4. 使用bash 执行,shell发生了什么?
bash 是当前默认shell,使用 echo $SHELL 查看当前shell
[root@192 ~]# echo $SHELL
/bin/bash
[root@192 ~]# bash test.sh
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 0 139124 0 652372 0 0 53 93 82 146 0 1 98 0 0
0 0 0 138860 0 652372 0 0 0 0 69 126 0 1 99 0 0
开启另一个终端使用pstree来观察脚本执行情况
[root@192 ~]# pstree -pca 11226
bash,11226
└─bash,45904 test.sh
└─vmstat,45905 -n 1
由此可以看出在执行 bash test.sh
时,先由本地shell 进程,开启一个子bash进程执行test.sh 脚本,在由test.sh进程开启 一个vmstat进程,这个效果和sh test.sh
效果相同