【Linux/shell】使用bash/sh file.sh、./file.sh 、source file.sh、. file.sh的區別(20210109)
阿新 • • 發佈:2021-01-10
#參考文章:
https://blog.csdn.net/cju_277/article/details/112016245
首先列印當前程序的父程序ID和當前程序的ID,分別使用如下命令:
列印父程序ID: echo $PPID
列印當前程序ID: echo $$
現在把它寫入腳本里面,如下所示:
[[email protected] ~]#cat test.sh
#!/bin/bash
echo " PPID: $PPID ,PID: $$"
在執行之前,先來確定一下當前shell環境的PID號:
[[email protected] ~]#tty
/dev/pts/0
[[email protected] ~]#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: [email protected]/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
[[email protected] ~]#
可以看出來當前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