1.Source是在父進程中執行腳本的;
當我們執行test.sh的時候,是當前終端所在的shell fork一個子shell然后執行test.sh的,執行完了再返回終端所在的shell。明白這點,就容易理解了,我們在test.sh設置了AA環境 變量,它只在fork出來的這個子shell中生效,子shell只能繼承父shell的環境變量,而不能修改父shell的環境變量,所以test.sh結束后,父進程的環境就覆蓋回去。所以在test.sh之后完之后,我們用set命令是看不了AA這個環境變量的值的。
那有什么辦法可以讓腳本的環境變量在腳本執行之后仍然對當前終端存在呢?用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 命令。
2.PATH具體的作用和含義
PATH說簡單點就是一個字符串變量,當輸入命令的時候LINUX會去查找PATH里面記錄的路徑。比如在根目錄/下可以輸入命令ls,在/usr目錄下也可以輸入ls,但其實ls這個命令根本不在這個兩個目錄下,事實上當你輸入命令的時候LINUX會去/bin,/usr/bin,/sbin等目錄下面去找你此時輸入的命令,而PATH的值恰恰就是/bin:/sbin:/usr/bin:……。其中的冒號使目錄與目錄之間隔開。
關於新增自定義路徑:現在假設你新安裝了一個命令在/usr/locar/new/bin下面,而你又想像ls一樣在任何地方都使用這個命令,你就需要修改環境變量PATH了,准確的說就是給PATH增加一個值/usr/locar/new/bin。你只需要一行bash命令export PATH=$PATH:/usr/locar/new/bin。這條命令的意思太清楚不過了,使PATH自增:/usr/locar/new/bin,既PATH=PATH+":/usr/locar/new/bin";通常的做法是把這行bash命令寫到/root/.bashrc的末尾,然后當你重新登陸LINUX的時候(應該是linux啟動時就會執行這個文件),新的默認路徑就添加進去了。當然這里你直接用source /root/.bashrc執行這個文件重新登陸了。你可以用echo $PATH命令查看PATH的值。
“PATH=$PATH:路徑1:路徑2:...:路徑n”,意思是可執行文件的路徑包括原先設定的路徑,也包括從“路徑1”到“路徑n”的所有路徑。當用戶輸入一個一串字符並按回車后,shell會依次在這些路徑里找對應的可執行文件並交給系統核心執行。那個“$PATH”表示原先設定的路徑仍然有效,注意不要漏掉。某些軟件可能還有“PATH”以外類型的環境變量需要添加,但方法與此相同,並且也需要注意“$”。
PATH環境變量簡單來說也是一種變量,就是shell會自動從這些PATH中去找命令的范圍,而路徑環境變量就相當於是給了系統一張導航圖這些路徑下面去運行環境,而不是每次需要你去輸入這些命令的完整路徑,這樣就會一勞永逸!
3.export的作用
1、執行腳本時是在一個子shell環境運行的,腳本執行完后該子shell自動退出;
2、一個shell中的系統環境變量才會被復制到子shell中(用export定義的變量);
3、一個shell中的系統環境變量只對該shell或者它的子shell有效,該shell結束時變量消失(並不能返回到父shell中);
4、不用export定義的變量只對該shell有效,對子shell也是無效的。
/etc/environment是設置整個系統的環境,而/etc/profile是設置所有用戶的環境,前者與登錄用戶無關,后者與登錄用戶有關
/etc/profile:此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行.並從/etc/profile.d目錄的配置文件中搜集shell的設置./etc/bashrc:為每一個運行bashshell的用戶執行此文件.當bash shell被打開時,該文件被讀取.~/.bash_profile:每個用戶都可使用該文件輸入專用於自己使用的shell信息,當用戶登錄時,該文件僅僅執行一次!默認情況下,他設置一些環境變量,執行用戶的.bashrc文件.~/.bashrc:該文件包含專用於你的bashshell的bash信息,當登錄時以及每次打開新的shell時,該該文件被讀取.~/.bash_logout:當每次退出系統(退出bashshell)時,執行該文件.另外,/etc/profile中設定的變量(全局)的可以作用於任何用戶,而~/.bashrc等中設定的變量(局部)只能繼承/etc/profile中的變量,他們是"父子"關系.