天天看點

ubuntu下source、sh、bash、./執行腳本的差別

如何運作shell程式,如何在shell程式以及後續腳本中使用同一個變量,這些在工作中經常用到, 我找到如下的文章,再加深複習一下。

1.source指令用法:

  source FileName

  作用:在目前bash環境下讀取并執行FileName中的指令。該filename檔案可以無"執行權限"

    注:該指令通常用指令“.”來替代。

    如:source .bash_profile

        . .bash_profile兩者等效。

    source(或點)指令通常用于重新執行剛修改的初始化文檔。

    source指令(從 C Shell 而來)是bash shell的内置指令。

    點指令,就是個點符号,(從Bourne Shell而來)。

    source的程式主體是bash,腳本中的$0變量的值是bash,而且由于作用于目前bash環境,腳本中set的變量将直接起效

2 sh, bash的指令用法:

     sh/bash FileName

     作用:打開一個子shell來讀取并執行FileName中指令。該filename檔案可以無"執行權限"

     注:運作一個shell腳本時會啟動另一個指令解釋器.

         每個shell腳本有效地運作在父shell(parent shell)的一個子程序裡.

            這個父shell是指在一個控制終端或在一個xterm視窗中給你指令訓示符的程序.

         shell腳本也可以啟動他自已的子程序.

            這些子shell(即子程序)使腳本并行地,有效率地地同時運作腳本内的多個子任務.

    在ubuntu中sh隻是bash的一個連結。

    由于是在子shell中執行,腳本設定的變量不會影響目前shell。

3、./的指令用法:

     ./FileName

     作用:打開一個子shell來讀取并執行FileName中指令。該filename檔案需要"執行權限"

     注:運作一個shell腳本時會啟動另一個指令解釋器.

         每個shell腳本有效地運作在父shell(parent shell)的一個子程序裡.

            這個父shell是指在一個控制終端或在一個xterm視窗中給你指令訓示符的程序.

         shell腳本也可以啟動他自已的子程序.

            這些子shell(即子程序)使腳本并行地,有效率地地同時運作腳本内的多個子任務.

    由于是在子shell中執行,腳本設定的變量不會影響目前shell。

4.   export: 一個變量建立時,它不會自動地為在它之後建立的shell程序所知。而指令export可以向後面的shell傳遞變量的值。當一個shell腳本調用并執行時,它不會自動得到原為腳本(調用者)裡定義的變量的通路權,除非這些變量已經被顯式地設定為可用。export指令可以用于傳遞一個或多個變量的值到任何後繼腳本

5.   舉例: 比如您在一個腳本裡export $KKK=111 ,假如您用./a.sh執行該腳本,執行完畢後,您運作 echo $KKK ,發現沒有值,假如您用source來執行 ,然後再echo ,就會發現KKK=111。因為調用./a.sh來執行shell是在一個子shell裡運作的,是以執行後,結構并沒有反應到父shell裡,但是 source不同他就是在本shell中執行的,是以能夠看到結果.

小測試

1 建立test.sh

  #!/bin/bash

  export s=/home/jboss/

2

  執行指令: source test.sh

            echo $s

  結果輸出: /home/jboss/

3  新開個shell

   執行指令:  ./test.sh

              echo $s

   結果:  沒有輸出s值

結論:

1、執行腳本時是在一個子shell環境運作的,腳本執行完後該子shell自動退出。

2、一個shell中的系統環境變量才會被複制到子shell中(用export定義的變量);

3、一個shell中的系統環境變量隻對該shell或者它的子shell有效,該shell結束時變量消失(并不能傳回到父shell中)。3、不用 export定義的變量隻對該shell有效,對子shell也是無效的。

直接執行一個腳本檔案是在一個子shell中運作的,而source則是在目前shell環境中運作的。

source可以讓腳本影響它們的父shell環境,這和export去影響子shell環境相反.