首頁 > 軟體

Linux系統環境變數位置, 環境變數持久化

2020-06-16 16:45:36

一.系統環境變數位置

  在上章中,知道了如何修改系統環境變數,如PATH變數,以及建立自己的全域性環境變數和區域性環境變數。這篇學習怎麼讓環境變數的作用持久化。在此之前,先了解下系統環境變數檔案會在哪些位置,當使用bash shell時,bash是如何查詢環境變數位置的。下面先來介紹幾個檔案,這些檔案叫啟動檔案或叫環境檔案。

  bash檢查的啟動檔案(環境檔案)取決於你啟動bash shell的方式。啟動bash shell有3種方式:

        (1) 登入時的預設登入shell。

        (2) 互動式shell。

        (3) 執行指令碼的非互動式shell。
    

  1.1 登入shell

    登陸shell是指:(1) 使用者登陸時,輸入使用者名稱和密碼後啟動的shell(例如使用ssh登入遠端主機等);(2) 通過帶--login引數的命令:bash --login而啟動的shell。當登入linux系統時,bash shell作為登入shell啟動,登入shell會從5個不同的啟動檔案裡讀取命令。包括:/etc/profile,  $HOME/.bash_profile, $HOME/.bashrc, $HOME/.bash_login, $HOME/.profile。而/etc/profile檔案是系統預設的bash shell的主啟動檔案。另外4個啟動檔案是針對使用者的(不同發行版中,四個啟動檔案一般都只有一到二個),可根據個人需求客製化。

     (1) /etc/profile檔案

      只要登入了linux系統,bash就會執行/etc/profile啟動檔案中的命令(不同發行版的/etc/profile,有不同的設定和命令),profile檔案內容如下圖所示:
        
      profile檔案內容太長,擷取了一段。 上圖有個for語句,它用來迴圈讀取/etc/profile.d目錄下的所有檔案。該檔案目錄包含以下檔案,如下圖所示:
        
      上圖啟動檔案中sh字尾的供bash shell 使用, csh字尾的供 c shell使用。lang.csh和lang.sh檔案會嘗試去判定系統上採用的預設語言字元集。對應LANG環境變數。
        

    (2) $HOME目錄下的啟動檔案
      HOME目錄下的隱藏檔案,找到了$HOME/.bash_profile, $HOME/.bashrc。每個使用者都可以編輯這些檔案新增自己的環境變數,這此環境變數會在每次啟動 bash sehll 對談時生效。 HOME目錄如下圖所示:
        
      .bash_profile啟動檔案會先去檢查HOME目錄下是不是有一個叫.bashrc的啟動檔案,如果有就會先執行裡面的命令。bash_profile檔案內容如下圖所示:
        
      上圖中,可以看到在.bash_profile檔案中給PATH變數新增了一個目錄路徑,並用export PATH 匯入到全域性中。在.bash_profile檔案中加的變數可以持久化。

 

  1.2 互動式shell進程

    互動式shell是指:就是在終端上執行,shell等待你的輸入,並且立即執行你提交的命令。命令列提示符輸入命令,只會檢查使用者HOME目錄中的.bashrc檔案。 該檔案兩個作用:1是檢視/etc目錄下通用的bashrc檔案,2是為使用者提供一個客製化自己的命令別名(前面講alias命令)和私有指令碼函數(後面介紹)。 .bashrc檔案內容如下圖所示:
      

  1.3 非互動式shell

    非互動式shell是指:以shell script(非互動)方式執行。在這種模式下,shell不與你進行互動,而是讀取存放在檔案中的命令,並且執行它們。當它讀到檔案的結尾EOF,shell也就終止了。 系統執行shell指令碼時用的這是這種shell。區別是它沒有命令提示字元。但當你的系統上執行指令碼時,也許希望能夠執行一些特定啟動的命令。
    為了處理這種情況bash shell提供了BASH_ENV環境變數。當shell 啟動一個非互動式shell進程時,它會檢查這個環境變數來檢視要執行的啟動檔案。預設情況下並未設定該變數,使用printenv命令只返回提示符:
      

    正如上圖所示:BASH_ENV環境變數沒有設定值。這種非互動式shell 一般通過啟動一個子shell來執行。如果父shell是登入shell,那麼可以從/etc/profile,/etc/profiled/*.sh和$HOME/.bashrc檔案中繼承這些變數。如果父shell中的變數是區域性變數時,那麼子shell無法繼承。如果不啟動子shell, 變數已存在於當前shell中,就算不設定BASH_ENV,也可以使用當前的區域性和全域性變數。

    互動式與非互動式二者區別:讀取的組態檔不同,互動式bash必然讀取~/.bashrc檔案;非互動式bash讀取的是環境變數BASH_ENV(通常情況下)所指定的組態檔。

 

二. 環境變數持久化

  上面了解了各種shell進程對應的環境檔案,找出永久性環境變數就容易多了。可以利用這些檔案來建立自己的永久性全域性變數或區域性變數。全域性變數是對所有使用者都需要使用的變數,可以將新的變數或修改過的變數設定放在/etc/profile檔案中,但升級了發行版該檔案也會更新,所以這點要注意 (對所有使用者)。
  最好是在/etc/profile.d目錄中建立一個以.sh結尾的檔案,把所有新的變數或修改過的變數全部放在此檔案中(對所有使用者)。
  對於儲存個人使用者永久性bash shell變數的地方是$HOME/.bashrc檔案。這一點適用於所有型別的shell進程(僅對當前使用者)。

  下面來演示給mysql工具包路徑,新增到PATH全域性變數中:

  (1)在虛擬根目錄下輸入mysqldump 工具,提示未找到命令,如下圖所示:
    
  (2)找到mysqldump工具包的位置,路徑是/usr/local/mysql/bin。如下圖所示:
    
  (3) 檢視現有PATH的路徑列表,以冒號分隔的預設有5個路徑。如下圖所示:
    
  (4) 在$HOME/.bash_profile檔案中加入一個PATH全域性變數值,路徑為/usr/local/mysql/bin。如下圖所示:
    
  (5) exit退出終端或shutdown後重新開機,在虛擬根目錄下輸入mysqldump 工具,PATH設定的mysql工具包路徑永久生效。如下圖所示:
    
    再切換到mysql使用者下,PATH的設定也是生效的,說明是跨使用者生效的。
    
    在root使用者下,使用子shell, PATH的設定也是生效的,說明跨進程,已設定成了全域性變數。
    
  (6) 最後在看下PATH路徑,/usr/local/mysql/bin  已新增了
    


IT145.com E-mail:sddin#qq.com