1、回顾
我们昨天给大家分享了四种执行脚本的方法,不知道大家还记不记得了,分别是使用bash file.sh、./file.sh 、source file.sh、. file.sh。我们建议大家使用前两种方法来执行脚本,这也是日常工作中大家都使用的方式。
那今天我们先来说说这四种执行脚本的区别是什么
2、区别
首先我们打印当前进程的父进程ID和当前进程的ID,分别使用命令
打印父进程ID: echo $PPID
打印当前进程ID: echo $$
现在我们把它写入脚本里面,如下所示
[root@localhost ~]# cat test.sh
#!/bin/bash
echo " PPID: $PPID ,PID: $$"
在执行之前,我们先来确定一下当前我们shell环境的PID号
[root@localhost ~]# tty
/dev/pts/2
[root@localhost ~]# ps axjf | grep pts/2
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
1016 6281 6281 6281 ? -1 Ss 0 0:00 _ sshd: root@pts/2
6281 6283 6283 6283 pts/2 7053 Ss 0 0:00 _ -bash
6283 7053 7053 6283 pts/2 7053 R 0 0:00 _ ps axjf
6283 7054 7053 6283 pts/2 7053 S 0 0:00 _ grep --color=pts/2
可以看出来我们当前shell进程的PID号(-bash)是6283这个数字,那现在我们来执行一下看看。
2.1、使用bash命令直接执行
[root@localhost ~]# bash test.sh
PPID: 6283 ,PID: 7088
可以看出来当前的shell环境又生成了一个新的子shell环境,其子进程ID:7088,此时我们 $$ 正好打印的是这个子进程的ID号
2.2、使用./命令执行(先赋予x权限)
[root@localhost ~]# ./test.sh
PPID: 6283 ,PID: 7115
可以看出来当前的shell环境也是又生成了一个新的子shell环境,其子进程ID:7115,进程ID号是随机的,因此跟上面的不一样。
2.3、使用source命令来执行
[root@localhost ~]# source test.sh
PPID: 6281 ,PID: 6283
我们发现这次的PID号居然是6283,也就是我们上面给大家展示的当前shell环境的PID,而6281是其父进程ID号。这说明我们使用source命令执行脚本后 并没有 生成一个新的子shell环境。还是在原来的bash shell环境中执行的shell脚本。
2.4、使用 . 来执行
[root@localhost ~]# . test.sh
PPID: 6281 ,PID: 6283
依然是与上面的soure命令的情况是一样的,使用 . 来执行脚本,并没有生成新的子shell环境,还是在原来的bash shell环境中执行的。
好了,上面的就是我们给大家分享的研究成果,希望大家今后在执行shell脚本时要知道自己是在做什么。不然回因为执行的shell环境问题而大费周折。