1. 程式人生 > >[轉載] Linux export變數的生命週期和shell的生命週期相同,即shell指令碼執行完畢後,相應的export變數便失效了

[轉載] Linux export變數的生命週期和shell的生命週期相同,即shell指令碼執行完畢後,相應的export變數便失效了

說說shell指令碼中的export 和 source,bash

小弟剛剛接觸linux,對linux上的很多東西都比較陌生,所以寫一寫部落格,當做自己工作的總結和技術的積累吧,也是鞭策自己不斷努力的去學習。

今天之所以起這個標題,把export,source ,bash這三個命令放在一起講,實在是因為自己做了一件蠢事。 什麼樣的蠢事先不說。先分析下這三個命令。

首先是export命令。

  • 1.export命令

Linux export命令用於設定或顯示環境變數。

在shell中執行程式時,shell會提供一組環境變數。export可新增,修改或刪除環境變數,供後續執行的程式使用。同時,重要的一點是,export的效力僅及於該次登陸操作。登出或者重新開一個視窗,export命令給出的環境變數都不存在了。

該命令的語法如下:

export [-fnp][變數名稱]=[變數設定值]

其中:

  • -f  代表[變數名稱]中為函式名稱。
  • -n  刪除指定的變數。變數實際上並未刪除,只是不會輸出到後續指令的執行環境中。
  • -p  列出所有的shell賦予程式的環境變數。

你可以只打出export來檢視當前的所有環境變數。如果你要在某個環境變數(比如PATH)中加入一些新的路徑(如/bin/bash),可以使用如下命令格式

export PATH=/bin/bash:$PATH

就OK了。

  • 2.bash命令

像sh,bash,./命令是用來執行shell指令碼的,用例如下:

[[email protected] bin]#bash  filename
[[email protected] bin]#sh filename
[[email protected] bin]#./filename

這三種形式都是用來開啟一個子shell來讀取並執行FileName中命令。執行一個shell指令碼時會啟動另一個命令直譯器。每個shell指令碼有效地執行在父shell(parent shell)的一個子程序裡。 這個父shell是指在一個控制終端或在一個xterm視窗中給你命令指示符的程序。shell指令碼也可以啟動他自已的子程序。這些子shell(即子程序)使指令碼並行地,有效率地地同時執行指令碼內的多個子任務。略有不同的是:在bash/sh命令下,filename檔案可以無"執行許可權",即沒有rwx中的x許可權。而對於./命令,filename檔案必須要有執行許可權。

接下來是source命令

  • 3.source命令

該命令的用例如下:

[[email protected] bin]#source filename
[[email protected] bin]# . filename

作用:在當前bash環境下讀取並執行FileName中的命令。該filename檔案可以無"執行許可權"。該命令通常用命令“.”來替代。

 source(或點)命令通常用於重新執行剛修改的初始化文件。source命令(從 C Shell 而來)是bash shell的內建命令。

而點命令,就是個點符號,(從Bourne Shell而來)。

source的程式主體是bash,指令碼中的$0變數的值是bash。

 

好的,現在可以說自己幹了什麼蠢事了。一般在執行指令碼程式前,都要先設定一下自己要用到的環境變數,再跑自己的程式指令碼。有一天早上我跑完指令碼,發現!發現!發現!/bin目錄下的檔案全被我刪了!!!當時心裡是崩潰的。於是調查原因。才發現了問題出在bash命令和source命令上。不廢話,上圖。

愚蠢的我使用了bash命令設定環境變數(env.sh),跑完env.sh後程序回到父shell,變數自然都失效了,然後再跑工作指令碼,結果工作指令碼中有rm語句,結果就悲劇了。

所以在linux下跑程式並不是那麼無腦,有時候還真是要多想想。今天就到這裡,以後再來!(希望不要在出刪/bin目錄這種么蛾子了= =)

 

作者:非我在

出處:http://www.cnblogs.com/flying-tiger/

 

1、source命令用法:

  source FileName

  作用:在當前bash環境下讀取並執行FileName中的命令。該filename檔案可以無"執行許可權"

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

    如:source .bash_profile

        . .bash_profile兩者等效。

    source(或點)命令通常用於重新執行剛修改的初始化文件。

    source命令(從 C Shell 而來)是bash shell的內建命令。

    點命令,就是個點符號,(從Bourne Shell而來)。

2、sh和bash命令用法:

     sh FileName

     bash FileName

     作用:在當前bash環境下讀取並執行FileName中的命令。該filename檔案可以無"執行許可權"

     注:兩者在執行檔案時的不同,是分別用自己的shell來跑檔案。

   sh使用“-n”選項進行shell指令碼的語法檢查,使用“-x”選項實現shell指令碼逐條語句的跟蹤,

   可以巧妙地利用shell的內建變數增強“-x”選項的輸出資訊等。

3、./的命令用法:

     ./FileName

     作用:開啟一個子shell來讀取並執行FileName中命令。

     注:執行一個shell指令碼時會啟動另一個命令直譯器.

         每個shell指令碼有效地執行在父shell(parent shell)的一個子程序裡.

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

         shell指令碼也可以啟動他自已的子程序.

            這些子shell(即子程序)使指令碼並行地,有效率地地同時執行指令碼內的多個子任務.

shell的嵌入命令:

: 空,永遠返回為true
.   從當前shell中執行操作
break 退出for、while、until或case語句
cd 改變到當前目錄
continue 執行迴圈的下一步
echo 反饋資訊到標準輸出
eval 讀取引數,執行結果命令
exec 執行命令,但不在當前shell
exit 退出當前shell
export 匯出變數,使當前shell可利用它
pwd 顯示當前目錄
read 從標準輸入讀取一行文字
readonly 使變數只讀
return 退出函式並帶有返回值
set 控制各種引數到標準輸出的顯示
shift 命令列引數向左偏移一個
test 評估條件表示式
times 顯示shell執行過程的使用者和系統時間
trap 當捕獲訊號時執行指定命令
ulimit 顯示或設定shell資源
umask 顯示或設定預設檔案建立模式
unset 從shell記憶體中刪除變數或函式
wait 等待直到子程序執行完畢

下面再看下 shell 指令碼各種執行方式(source ./*.sh, . ./*.sh, ./*.sh)的區別

結論一: ./*.sh的執行方式等價於sh ./*.sh或者bash ./*.sh,此三種執行指令碼的方式都是重新啟動一個子shell,在子shell中執行此指令碼。

結論二: .source ./*.sh和 . ./*.sh的執行方式是等價的,即兩種執行方式都是在當前shell程序中執行此指令碼,而不是重新啟動一個shell 而在子shell程序中執行此指令碼。

驗證依據:沒有被export匯出的變數(即非環境變數)是不能被子shell繼承的

驗證結果:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

[[email protected] ~]#name=dangxu    //定義一般變數

[[email protected] ~]# echo ${name}

dangxu

[[email protected] ~]# cat test.sh   //驗證指令碼,例項化標題中的./*.sh

#!/bin/sh

echo ${name}

[[email protected] ~]# ls -l test.sh  //驗證指令碼可執行

-rwxr-xr-x 1 root root 23 Feb 6 11:09 test.sh

[[email protected] ~]# ./test.sh    //以下三個命令證明了結論一

[[email protected] ~]# sh ./test.sh

[[email protected] ~]# bash ./test.sh

[[email protected] ~]# . ./test.sh   //以下兩個命令證明了結論二

dangxu

[[email protected] ~]# source ./test.sh

dangxu

[[email protected] ~]#

總結

以上所述是小編給大家介紹的shell中source、sh、bash、./執行指令碼的區別,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回覆大家的。在此也非常感謝大家對指令碼之家網站的支援!