linux指令碼中父shell與子shell 執行的幾種方式
本文主要介紹以下幾個命令的區別:
shell
subshell
source
$ (commond)
`commond`
Linux執行Scripts有兩種方式,主要區別在於是否建立subshell
1. source filename or . filename
不建立subshell,在當前shell環境下讀取並執行filename中的命令,相當於順序執行filename裡面的命令
2. bash filename or ./filename
建立subshell,在當前bash環境下再新建一個子shell執行filename中的命令
子shell繼承父shell的變數,但子shell不能使用父shell的變數,除非使用export
【備註:這和名稱空間是相似的道理,甚至和c中的函式也有些類似】
子Shell從父Shell繼承得來的屬性如下:
當前工作目錄
環境變數
標準輸入、標準輸出和標準錯誤輸出
所有已開啟的檔案識別符號
忽略的訊號
子Shell不能從父Shell繼承的屬性,歸納如下:
除環境變數和.bashrc檔案中定義變數之外的Shell變數
未被忽略的訊號處理
3. $ (commond)
它的作用是讓命令在子shell中執行
4. `commond`
和$(commond)差不多。
【這裡的“ ` ”符號是撇(反單引號),不是單引號,是鍵盤上Esc按鍵下面的那個鍵。】
5. exec commond
替換當前的shell卻沒有建立一個新的程序。程序的pid保持不變
作用:
shell的內建命令exec將並不啟動新的shell,而是用要被執行命令替換當前的shell程序,並且將老程序的環境清理掉,而且exec命令後的其它命令將不再執行。
當在一個shell裡面執行exec ls後,會列出了當前目錄,然後這個shell就自己退出了。(後續命令不再執行)
因為這個shell已被替換為僅執行ls命令的程序,執行結束自然也就退出了。
需要的時候可以用sub shell 避免這個影響,一般將exec命令放到一個shell腳本里面,用主指令碼呼叫這個指令碼,呼叫點處可以用bash a.sh(a.sh就是存放該命令的指令碼),這樣會為a.sh建立一個sub shell去執行,當執行到exec後,該子指令碼程序就被替換成了相應的exec的命令。