首先,咱們從一個十分簡單的例子test.sh開始吧:html
#!/bin/sh #this is a test. cd /tmp echo "hello,this is a test"
這是一個十分簡單的程序,可是運行結果可能會讓你吃驚哦!linux
這個時候,咱們發現程序運行以後,並無改變當前目錄。(黑人問號???)shell
彆着急,咱們先了解一下linux程序如何運行。bash
linux程序三種執行方法this
運行linux程序有三種方法,分別是:命令行
一、使文件具備可執行權限,直接運行文件。htm
chmod 命令用來修改文件的權限。+x是使文件擁有可執行的權限。就如上面咱們運行程序同樣。可是咱們看到的結果與咱們想象當中有必定的出入。進程
二、直接調用命令解釋器執行程序。get
以下圖所示:io
因爲咱們的解釋器是/bin/sh,因此,用sh命令解釋器來執行程序。
咱們也看到當前的工做路徑沒有發生變化。(黑人問號???)
三、使用source執行文件。
沒錯,這裏咱們發現當前的工做路徑發生了變化,(黑人問號???)可是究竟爲何呢?讓咱們帶着三個黑人問號詳細瞭解一下linux程序究竟怎麼執行。
linux程序執行的過程
當命令行shell執行程序時,首先判斷是否該程序具備可執行權限。若是沒有可執行權限,就會提示:Permission denied(權限不夠),以下圖所示:
在第一種方法中,咱們直接執行文件,就先加上了可執行權限。
當命令行接收到咱們的執行命令,而且判斷具備可執行權限後,則調用Linux內核命令新建一個進程,在新建的進程中調用指定的命令。可是咱們的test.sh不是編譯型的文件,因此linux內核不知道如何執行,而後交給shell,shell就知道這是一個腳本,那麼就啓動一個新的shell進程來進行執行。可是linux系統有不少shell,如圖:
咱們程序第一行看到是#!/bin/sh,這時,命令行就啓用一個新的bash進程來執行程序。
程序執行差別
在咱們運行shell程序的三種方法中,前兩種方法的執行過程以下:
(1)父進程接收到命令,而後發現不是內建命令,因而建立了一個和本身同樣的s h e l l進程,來執行這個外部命令
(2)這個s h e l l子進程用/bin/sh取代本身,sh進程設置本身的運行環境變量,其中包括了$PWD變量。
(3)sh進程依次執行內建命令cd和echo。在此過程當中,sh進程(子進程)的環境變量被cd命令改變。
(4)子進程執行完畢,就消亡了,一直在等待的父進程醒來,繼續接受命令。
因此咱們明白了前兩種方法執行結果跟咱們預期不同的緣由,父進程的當前目錄(環境變量)沒法被子進程改變。
可是,使用source執行是shell腳本時不會建立子進程,而是在父進程中直接執行。至此黑人問號消失,繼續加油寫代碼吧。
本文地址:http://www.linuxprobe.com/run-linux-program.html