LinuxShell中的“.”和source,export理解

shell腳本裏面export的環境變量,在set裏面竟然看不到。爲什麼在shell腳本裏面用export設置環境變量之後,當shell執行完了,用set命令看不到呢?但是你如果直接在終端裏export 環境變量用set是看到的。

這裏要說一下shell的執行方法了,舉個例子來講:

一個shell腳本test.sh的內容爲:

【 #!/bin/bash

      export AA=123】

當我們執行test.sh的時候,是當前終端所在的shell fork一個子shell然後執行test.sh的,執行完了再返回終端所在的shell。明白這點,就容易理解了,我們在test.sh設置了AA環境 變量,它只在fork出來的這個子shell中生效,子shell只能繼承父shell的環境變量,而不能修改父shell的環境變量,所以test.sh結束後,父進程的環境就覆蓋回去。所以在test.sh之後完之後,我們用set命令是看不了AA這個環境變量的值的。

 

PS:fork概念:1.我們所執行的任何程序,都是由父進程(parent process)所產生出來的一個子進程(child process),子進程在結束後,將返回到父進程去。此一現像在Linux系統中被稱爲 fork。當子進程被產生的時候,將會從父進程那裏獲得一定的資源分配、及(更重要的是)繼承父進程的環境﹗

 

那有什麼辦法可以讓腳本的環境變量在腳本執行之後仍然對當前終端存在呢?用sorcue 或者.(dot) 。明確告訴shell不要fork執行腳本,而是在當前的shell執行,這樣環境變量就可以保存下來了。

source命令用法:

source Filename (通常用“.”來代替)

source test.sh 與 .test.sh是等效的。

【補充】

source命令與shell scripts的區別是,
source在當前bash環境下執行命令,而scripts是啓動一個子shell來執行命令。這樣如果把設置環境變量(或alias等等)的命令寫進 scripts中,就只會影響子shell,無法改變當前的BASH,所以通過文件(命令列)設置環境變量時,要用source 命令。

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