shell中export的作用和點空格運行腳本的意思

一直對shell中export 變量這個概念理解的模模糊糊,今天就來總結下。

在命令行中定義變量很簡單,如下:

[root@zhenglq ~]#VAR=zhenglq
[root@zhenglq ~]#echo $VAR
zhenglq
但是這麼定義的變量只在該shell中有效,在其它shell或者子shell中都無法訪問

例如重新打開一個終端窗口或者重新ssh到這臺機器上,echo $VAR 顯示的是空的。這也是爲什麼很多腳本定義變量都用export,如果想讓任何shell都有該變量還需要寫到開機時運行的腳本中。

export

man export  會找到下面這句

Names of exported shell variables
看了之後,我反正理解不了。
在說export之前先解釋下shell和子shell的概念,在我們登陸命令行時就相當於系統爲我們打開了一個shell,在這個shell上我們還可以運行腳本,跑這個腳本到底是重新啓動一個shell來運行還是在目前這個shell運行,取決於我們運行時的命令方式。

例如我們有個test.sh

#!/bin/sh
 
echo $zhenglq1


[root@zhenglq ~]#sh test.sh

[root@zhenglq ~]#. ./test.sh

這兩種運行方式是不一樣的,第一種運行方式是起一個子shell來運行,第二種方式是在當前shell中運行。


回到正題,如果我們不加export 定義變量,那麼子shell或其它新shell是無法繼承訪問的。如果加了export 來定義變量,子shell中是可以訪問這個變量的(注意非子shell依然無法訪問)。所以定義變量時加export就是讓子shell可以訪問,因爲很多腳本定義變量後會運行其它腳本,或者後續程序需要使用,所以會看到很多腳本中定義變量都是用export

現在該思考那如何讓每個打開的shell都有定義該變量怎麼弄,例如每次ssh上都不想再定義一遍。這時就需要把 export VAR=zhenglq  寫到開機運行的腳本中,因爲開機登陸就會運行,並且加了export,所以任何時候都可以使用

概念弄懂了看看簡單例子會印象更深

打開終端,定義一個沒定義過的變量

[root@zhenglq ~]#VAR=zhenglq
寫個test.sh腳本

#!/bin/sh . test.sh
 
echo $VAR

運行
[root@zhenglq ~]#sh test.sh

結果是空的,上面說過, 這種運行方式是啓動一個子shell來運行test.sh,但是變量沒有導出(加export),所以無法訪問


[root@zhenglq ~]#chmod u+x test.sh
[root@zhenglq ~]#.  ./test.sh
zhenglq
第一句是賦予test.sh擁有者執行權限,第二句是點空格點斜槓test.sh來運行,第三行是輸出結果。如果不清楚再回顧下上文:)

原文出處:https://blog.csdn.net/worldchinalee/article/details/80264686

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章