linux设置环境变量_什么是linux环境变量
本來這篇文章好幾天之前就寫好了,但是媳婦兒跟我說工作日就不要發了,大家都在上班,哪有閑心思看你的文章。哎,可能大家用頭條都是在放松刷娛樂,看小姐姐。所以就一直拖到現在。周末了,更是放松的好時候,葛優躺、刷小姐姐的時候別忘了來我這里學下linux。
上一篇文章《什么是linux命令》提到,linux在執行命令之前,其實是經由shell來處理的。Shell等待用戶的終端輸入,根據用戶輸入的命令名字,在環境變量PATH指定的路徑下尋找和命令名字匹配的可執行文件,然后創建子進程,該子進程會被linux內核調度執行,在子進程中加載可執行文件并執行。這就是一條命令執行的一個完整過程。當然這里面涉及的細節,不是一兩篇文章可以說的清楚的。后面我會在不同的文章中說明這些細節。shell作為用戶和linux內核溝通的橋梁,可以認為shell是linux內核與用戶溝通的默認官方代理人,有很多種不同版本的shell,最常見的是bash shell。所以當我們提到shell的時候,默認就是指的bash shell。如果你對這個代理人不滿意,也可以更換代理人。你甚至可以把python解釋器或者perl解釋器作為linux的shell。不過幾乎沒有人會對bash shell不滿意,也很少有人這么做。Bash作為linux的官方默認代理人已是歷史約定。這么說只是讓大家理解shell,它并沒有那么神秘,和其他的腳本解釋器,甚至我們敲的命令都是一樣的,你可以在shell里再執行shell,像這樣直接敲:bash,就會進入一個新的shell。至于怎么更換默認的shell,這不是這篇文章的內容。以后我會另外一篇文章說明怎么更換默認的shell。
我們回到本文的主題,上面提到shell是去環境變量PATH指定的路徑中尋找命令,那么什么是環境變量呢?簡單來講,環境變量是用來設置linux應用程序運行環境的變量。我們經常接觸的環境變量有PATH、HOME、HISTSIZE、HOSTNAME、PS1、PS2等。在shell命令行下可通過“echo $環境變量名”打印環境變量的值,也可通過env或者export命令查看系統中已有的環境變量。環境變量配置的是應用層的環境,由應用層程序設置并使用。不同的應用程序會關注不同的環境變量。比如很多時候PATH只會由shell關注,我們經常會配置的java環境變量,會由java虛擬機關注,其他的應用程序是不會關注的。如果你在命令行下只敲了cd,不帶路徑名,那么cd就會關注HOME這個環境變量,并切換到HOME環境變量指定的路徑中,這個就是登錄用戶的家目錄了。不過cd是shell的內置命令,所以HOME也主要是shell關注的。我最開始理解環境變量的時候,總是認為它們是內核的一部分,其實環境變量和內核沒有多大的關系。環境變量并不是用來配置linux內核的。如果你想對linux內核進行配置,可以在內核編譯配置階段通過make menuconfig配置或者在內核運行過程中通過sysctl命令配置。
環境變量是用來配置應用程序運行環境的變量,所以環境變量是和應用程序息息相關的,而應用程序在運行階段是以linux進程的形式存在的,每個進程都有自己的環境變量,那么這些環境變量存放在哪里呢?他們是從哪里來的呢?
這里我們需要從進程的虛擬地址空間布局著手。每個linux進程(shell也是一個linux進程)都有自己獨立的進程虛擬地址空間,進程虛擬地址空間分為內核空間和用戶空間,通常所有的linux進程虛擬地址空間的內核空間896M以內的空間會直接線性映射到物理內存的0-896M空間內。為什么是896M,這也是歷史條件下形成的。剩下的虛擬地址空間內核會按照自己的分頁機制,間接的映射到物理內存中。關于這部分內容就是linux內核的內存管理部分了,本文不作深入討論。后面會專門抽出時間寫一篇內存管理的文章。
說的環境變量,為什么會扯到進程虛擬地址空間呢?因為我們的環境變量是以環境變量表(數組)的形式存放在進程虛擬地址空間的用戶空間里。這也是我上面說環境變量和內核沒什么關系的原因。進程虛擬地址空間的布局圖如下圖所示:
進程虛擬空間布局
這張進程虛擬內存布局圖是本人所畫的《linux內核原理大圖》的局部。該圖目前還在創作中,已完成大部分。關注本頭條號,可隨時關注本人最新文章。圖中深紅色的gap上方為內核空間,gap下方為用戶空間。內核空間和用戶空間有gap隔開。這也是內核的一種保護機制。這張內存布局圖非常重要,在linux下學習c/c++編程的人應該對這張圖比較熟悉,因為不管是c/c++還是linux內核,原理性的東西都是圍繞著這張圖展開的。這張圖毫不夸張的說,就是打開linux 環境下c/c++基礎編程的金鑰匙。
在用戶空間的最上部,stack和gap中間,就是環境變量表所存放的位置了。我們的進程如果要想獲取環境變量或者設置環境變量,都是從這個內存區域獲取和設置的。該部分會通過內核分頁機制映射到物理內存中。
那么這里的環境變量又是從哪里來的呢?在《什么是linux命令》一文中,我們指出,linux運行一條命令,就會創建出一個進程,而這個進程是由shell創建的。也就是你在linux下執行的任何命令所創建的進程,都是shell的子進程。所以一個進程的環境變量,大部分都是從shell進程繼承而來的。子又生孫,孫又生子,子子孫孫無窮盡也,而山不在高...
不好意思,我學的有點雜,我們回到主題。那么shell進程的環境變量又是從哪里來的呢?我們前面說過,shell作為linux內核與用戶打交道的代理人,所以要面對各型各色的人,每個人都有不同的喜好。我們上文提到,可能會有人在小角落里密謀想要替換掉bash shell,Shell為了留住大家的心,適應不同人的喜好,就允許每個用戶設置自己的環境變量。所以shell的環境變量其實就是用戶你(你是主角,出場要帶特效)自己設置的。所以我們經常說環境變量的時候,前面總是加上shell,叫shell環境變量。每次shell啟動的時候,都會讀取一系列的環境配置文件。將環境配置文件中環境變量的值讀到自己內存空間的位置,也就是上圖所說的位置啦。然后由shell生成的子進程就會繼承shell的環境變量。那么shell(我們這里主要說的bash)的環境變量配置文件存放在哪里呢?有哪些設置環境變量的方法呢?我知道如果文章寫的太長,就沒有人會有耐心看下去的,所以我會在下一篇文章中說明shell環境變量的配置。因為平時還要養家糊口,我的出文速度有點慢,所以機智的你,在還沒等到我的文章之前,就已經找到答案了。那么這篇文章也算起到拋磚引玉的作用了。
我們在知道一樣東西的來龍去脈后,是不是學習起來就更加順手了呢。當然還是那句話,你知道的越多,不知道的也越多。這邊文章又挖了很多坑,歡迎關注本頭條號,我們一起挖坑,一起填坑。本人水平有限,如果文章有誤,歡迎批評指正。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的linux设置环境变量_什么是linux环境变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 金蝶账套管理员账号ADM(金蝶账套管理用
- 下一篇: doov怎么恢复出厂设置(vovo恢复出