#参考文章:
https://blog.csdn.net/cju_277/article/details/112016245
首先打印当前进程的父进程ID和当前进程的ID,分别使用如下命令:
打印父进程ID: echo $PPID
打印当前进程ID: echo $$
现在把它写入脚本里面,如下所示:
[root@centos76 ~]#cat test.sh
#!/bin/bash
echo " PPID: $PPID ,PID: $$"
在执行之前,先来确定一下当前shell环境的PID号:
[root@centos76 ~]#tty
/dev/pts/0
[root@centos76 ~]#ps axjf|head -1;ps axjf | grep pts/0
PPID PID PGID SID TTY TPGID STAT UID TIME COMMAND
26780 22636 22636 22636 ? -1 Ss 0 0:00 \_ sshd: root@pts/0
22636 22639 22639 22639 pts/0 22894 Ss 0 0:00 \_ -bash
22639 22894 22894 22639 pts/0 22894 R+ 0 0:00 \_ ps axjf
22639 22895 22894 22639 pts/0 22894 S+ 0 0:00 \_ grep --color=auto pts/0
[root@centos76 ~]#
可以看出来当前shell进程的PID号(-bash)是22639这个数字,现在来执行一下看看。
1.使用bash/sh命令执行
可以看出来当前的shell环境又生成了一个新的子shell环境,其子进程ID:22926,此时 $$ 正好打印的是这个子进程的ID号。
2.使用./命令执行(先赋予x权限)
可以看出来当前的shell环境也是又生成了一个新的子shell环境,其子进程ID:22988,进程ID号是随机的,因此跟上面的不一样。
3.使用source命令来执行
可以发现这次的PID号是22639,也就是当前shell环境的PID,而22636是其父进程ID号。这说明使用source命令执行脚本后并没有生成一个新的子shell环境。还是在原来的bash shell环境中执行的shell脚本。
4.使用.命令来执行
依然是与上面的soure命令的情况是一样的,使用 . 来执行脚本,并没有生成新的子shell环境,还是在原来的bash shell环境中执行的。
总结
总结:
(1)bash/sh 与 路径,后面跟上sh脚本的话,当前的shell环境会生成了一个新的子shell环境来运行shell脚本的;
bash/sh file.sh
./file.sh
(2)source 和 .是等价的,后面跟上sh脚本的话,并不会生成一个新的子shell环境,还是在原来的bash shell环境中执行的shell脚本。
source file.sh、
. file.sh