Linux 環境變量和source命令 (轉)

多是班門弄斧了,僅share給尚不知道的童鞋。 shell

 1.       問題的來源: 安全

爲何咱們編譯Android代碼時,須要輸入:  source ./build/envsetup.sh  或者 . ./build/envsetup.sh哪? (這裏的source和.的做用是一致的), 爲何不能夠直接執行envsetup.sh腳步而須要經過source命令執行哪?  函數

 2.      Linux 環境變量的機制ui

 Linux的環境變量是存儲於RAM中的,每一個Process啓動時,OS會往Process的RAM中寫入環境變量,因此每一個Process的環境變量間是相互獨立的。 Linux每一個Process啓動時的初始環境變量是從其父進程繼承過來的,可是一旦子進程啓動後,那麼不會再和父進程的環境變量存在任何依賴關係,子進程的環境變量的更改不會影響父進程,反之亦然。 因此,要控制程序運行時能獲取的環境變量,只能在父進程中寫入。   繼承

3.     回答開始的問題 進程

Linux中,標準方式運行Shell Script會致使啓動一個新的shell進程來運行Script。 對於envsetup.sh而言,若是以標準方式執行,那麼就會啓動一個新的shell進程來運行,運行完成退回到當前的shell進程(咱們的編譯shell環境)。envsetup.sh內部定義了一系列的環境變量和shell函數,指望在咱們的編譯環境中被使用。那麼,若是使用標準方式(非Source)執行時,這些環境變量和函數的定義將只會在新的shell進程(當前編譯環境所在shell進程的子進程)中生效,當envsetup.sh執行後返回其父進程(當前編譯環境所在shell)時,全部envsetup.sh中定義的環境變量和函數在此編譯環境shell中並無生效,違背了咱們的意願,後續的編譯就不能引用了,好比mm,mmm都不能引用。 此時就須要使用source命令,在固然shell中使用source命令執行envsetup.sh時,不會fork出新的shell進程來運行,而是直接在當前shell進程中讀取envsetup.sh文件來運行,這樣使得envsetup.sh中的環境變量和函數的定義在當前的用戶編譯環境shell中生效。 ip

4.     Android/Linux中環境變量的其餘一些說明 get

因爲init是User Space的1號進程,因此在init.rc中 Export的環境變量將在全部的User Space進程中可見。Zygote中設置的環境變量,將在全部的Android APK 進程中可見,可是在Native Process中不可見。   Native的環境變量的讀寫函數是,getenv/setenv Java層的環境變量的讀寫函數是:System.getProperties().getProperty/setProperty     注意和Android Property的區別:System.getproperty/setproperty   另外,因爲安全問題(這裏不詳述,又是另外一個話題)全部具備SUID/SGID屬性的Linux的可執行文件(包括.so)在運行時,會在自身進程中刪除一系列和安全相關的繼承來的環境變量,好比LD_LIBRARY_PATH等,使得在其和其子進程中沒法繼承和訪問系統的這些環境變量值。it

相關文章
相關標籤/搜索