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):執行子級命令後繼續執行父級命令,同時子級設定的環境變數會影響到父級的環境變數。
kill可以帶有程序ID號作為引數。當用kill向這些程序傳送訊號時,必須是這些程序的主人。如果試圖撤銷一個沒有許可權撤銷的程序或撤銷一個不存在的程序,就會得到一個錯誤資訊。與fork的區別是不新開一個sub-shell來執行被呼叫的指令碼,而是在同一個shell中執行. 所以被呼叫的指令碼中宣告的變數和環境變數, 都可以在主指令碼中得到和使用.
注意子程序執行完之後不能由exit退出操作,不然父程序接收到exit訊號之後直接執行exit了。
注意最好強制加環境變數 export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
----------------------------------------------------我是分割線-----------------------------------
此時 shell指令碼收到錯誤訊號 是會暫停執行命令,不會繼續執行的。
----------------------------------------------------------------------我是分割線------------------------------------------------------------------
Linux/Unix命令通常被分為兩類: 內部命令:cd、source、fg 外部命令:ls、cat 我們來看看它們的區別。 內部命令:內部命令被構建在shell之中。當執行shell命令時,內部命令的執行速度非常快。這是因為沒有其他的程序因為執行這條命令而被建立。比如說,當我們執行“cd”命令時,沒有程序被建立。在執行過程中只是簡單的改變當前的目錄。 外部命令:外部命令並沒有被構建在shell中。這些可執行的外部命令儲存在一個獨立的檔案當中。當一個外部命令被執行時,一個新的程序即被建立同時命令被執行。比如說,當我們執行“cat”(通常被儲存在/usr/bin目錄下)命令時,然後/usr/bin/cat被執行。 如何得到內部命令列表? 如果你使用的是bash shell,你可以通過“help”命令得到所有內部命令列表- $ help
- alias [-p] [name[=value] ... ] bg [job_spec ...]
- bind [-lpvsPVS] [-m keymap] [-f fi break [n]
- builtin [shell-builtin [arg ...]] caller [EXPR]
- case WORD in [PATTERN [| PATTERN]. cd [-L|-P] [dir]
- command [-pVv] command [arg ...] compgen [-abcdefgjksuv] [-o option
- .....
- $ type cd
- cd is a shell builtin
- $ type cat
- cat is /bin/cat
- z=`expr $x+$y`
內部命令
- let z=x+y