本文主要介紹如下幾個命令的區別:linux
shell
subshell
source
$ (commond)
`commond`
Linux執行Scripts有兩種方式,主要區別在因而否創建subshellshell
1. source filename or . filenamebash
不建立subshell,在當前shell環境下讀取並執行filename中的命令,至關於順序執行filename裏面的命令函數
2. bash filename or ./filename繼承
建立subshell,在當前bash環境下再新建一個子shell執行filename中的命令
子shell繼承父shell的變量,但子shell不能使用父shell的變量,除非使用export
【備註:這和命名空間是類似的道理,甚至和c中的函數也有些相似】進程
子Shell從父Shell繼承得來的屬性以下:ip
當前工做目錄
環境變量
標準輸入、標準輸出和標準錯誤輸出
全部已打開的文件標識符
忽略的信號
子Shell不能從父Shell繼承的屬性,概括以下:get
除環境變量和.bashrc文件中定義變量以外的Shell變量
未被忽略的信號處理變量
3. $ (commond)file
它的做用是讓命令在子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的命令。