1. 程式人生 > >shell呼叫指令碼--直接退出不執行後續命令

shell呼叫指令碼--直接退出不執行後續命令

1.不能使用exec呼叫指令碼,否則內建命令直接跳過主指令碼後面的命令,不執行;

2.自指令碼是否有exit退出命令,有的話,自指令碼會將環境變數返回給主指令碼,主指令碼收到訊號後執行退出命令,也不會執行後續的命令。

在shell指令碼中呼叫另一個指令碼的三種不同方法(fork, exec, source)

  • fork  ( /directory/script.sh) :如果shell中包含執行命令,那麼子命令並不影響父級的命令,在子命令執行完後再執行父級命令。子級的環境變數不會影響到父級。

fork是最普通的, 就是直接在腳本里面用/directory/script.sh來呼叫script.sh這個指令碼.

執行的時候開一個sub-shell執行呼叫的指令碼,sub-shell執行的時候, parent-shell還在。

sub-shell執行完畢後返回parent-shell. sub-shell從parent-shell繼承環境變數.但是sub-shell中的環境變數不會帶回parent-shell

  • exec (exec /directory/script.sh):執行子級的命令後,不再執行父級命令。

exec與fork不同,不需要新開一個sub-shell來執行被呼叫的指令碼.  被呼叫的指令碼與父指令碼在同一個shell內執行。但是使用exec呼叫一個新指令碼以後, 父指令碼中exec行之後的內容就不會再執行了

。這是exec和source的區別

  • source (source /directory/script.sh):執行子級命令後繼續執行父級命令,同時子級設定的環境變數會影響到父級的環境變數。

與fork的區別是不新開一個sub-shell來執行被呼叫的指令碼,而是在同一個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.

注意子程序執行完之後不能由exit退出操作,不然父程序接收到exit訊號之後直接執行exit了

注意最好強制加環境變數 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

----------------------------------------------------我是分割線-----------------------------------

kill可以帶有程序ID號作為引數。當用kill向這些程序傳送訊號時,必須是這些程序的主人。如果試圖撤銷一個沒有許可權撤銷的程序或撤銷一個不存在的程序,就會得到一個錯誤資訊。

此時 shell指令碼收到錯誤訊號 是會暫停執行命令,不會繼續執行的。

----------------------------------------------------------------------我是分割線------------------------------------------------------------------

Linux/Unix命令通常被分為兩類: 內部命令:cd、source、fg 外部命令:ls、cat 我們來看看它們的區別。 內部命令:內部命令被構建在shell之中。當執行shell命令時,內部命令的執行速度非常快。這是因為沒有其他的程序因為執行這條命令而被建立。比如說,當我們執行“cd”命令時,沒有程序被建立。在執行過程中只是簡單的改變當前的目錄。 外部命令:外部命令並沒有被構建在shell中。這些可執行的外部命令儲存在一個獨立的檔案當中。當一個外部命令被執行時,一個新的程序即被建立同時命令被執行。比如說,當我們執行“cat”(通常被儲存在/usr/bin目錄下)命令時,然後/usr/bin/cat被執行。 如何得到內部命令列表? 如果你使用的是bash shell,你可以通過“help”命令得到所有內部命令列表
  1. $ help
  2. alias [-p] [name[=value] ... ] bg [job_spec ...]
  3. bind [-lpvsPVS] [-m keymap] [-f fi break [n]
  4. builtin [shell-builtin [arg ...]] caller [EXPR]
  5. case WORD in [PATTERN [| PATTERN]. cd [-L|-P] [dir]
  6. command [-pVv] command [arg ...] compgen [-abcdefgjksuv] [-o option
  7. .....
如何知道一個命令是內部命令還是外部命令? 你可以使用type命令:
  1. $ type cd
  2. cd is a shell builtin
  3. $ type cat
  4. cat is /bin/cat
如果命令為內部命令,則type命令會明確的指出該命令是shell內嵌的。如果命令時外部命令,type則會給出該命令的執行路徑。 內部VS外部? 我們該使用外部命令還是內部命令或者哪一種命令更好?像這樣的問題是沒有任何意義的。因為大多數情況下我們只要達成我們的目標,而不必在意使用的是內部命令還是外部命令。 內部命令和外部命令最大的區別之處就是效能。內部命令由於構建在shell中而不必建立多餘的程序,要比外部命令執行快得多。因此和執行更大的指令碼道理一樣,執行包含很多外部命令的指令碼會損害指令碼的效能。 我們並不是總要面對內部命令與外部命令的選擇。但是在我們指令碼聯絡的過程中只要我們認真的觀察,我們可以發現有些地方我們可以避免使用外部命令。 比如說:將變數x與變數y求和賦予變數z。 外部命令:
  1. z=`expr $x+$y`

內部命令

  1. let z=x+y
let命令是shell的內嵌命令,然而expr則是外部命令。使用expr執行速度要慢一些。或許在一次性例項中這看起來微不足道。但是如果在執行大檔案時,其區別則是顯而易見的