shell中後臺執行函式
阿新 • • 發佈:2019-01-23
在shell中定義好的函式,執行的時候可以直接在腳本里面通過func &方式後臺執行。
一開始我很好奇為什麼shell腳本里面定義好的函式可以這麼用,通常我們在指令碼中都是以後臺方式執行其它的指令碼或者命令。
於是做了如下一個實驗:
new()
{
echo "func bkground pid by \$\$ is $$"
while [ 1 == 1 ]
do
sleep 5
done
}
echo "current script pid is $$"
new &
while [ 1 == 1 ]
do
sleep 5
done
執行如上指令碼後,通過ps檢視會發現當前運行了兩個shell程序,輸出如下:
[[email protected] ~]# ps -ef|grep test
root 26960 30678 0 12:05 pts/0 00:00:00 sh test.sh
root 26961 26960 0 12:05 pts/0 00:00:00 sh test.sh
所以可以確認,shell裡面是可以直接以後臺方式執行函式的,後臺執行的函式以一個新的程序執行。
可是這個時候看一下指令碼的輸出,會發函式雖然以後臺方式在運行了,但是獲取到的當前程序id卻和主程序一樣:
[[email protected] ..]# sh test.sh current script pid is 26960 func bkground pid by $$ is 26960
分析原因,可能是因為新的程序繼承了主程序的環境變數,直接把$$也copy過來了,所以在新的程序裡面獲取到的程序id是和父程序一樣的。這個現象和fork()很類似,於是google了一下,網上有人問到shell裡面是否有類似於c函式fork的實現,下面的回答就是用&。
所以這個後臺執行的函式程序,應該是直接copy的主程序的環境變數,導致在函式程序裡面通過$$獲取到的程序id是錯的。
最後在分享一個小技巧,在shell裡面如果以後臺的方式執行一個程式碼片段,前提是不定義函式,實現方式是:
{ ....
....
} &