幾句話說清Bash Shell環境變量
環境變量在Linux系統中的重要性不必多說,以下就以CentOS7為例,詳細闡述系統的環境變量。當用戶登錄Linux系統啟動一個bash shell時,系統默認會在幾個文件中查找命令,這些文件就被稱為環境文件。bash shell查找的環境文件取決於啟動bash shell的方式。bash shell的啟動方式可分為以下3種:
1. 用戶登陸時作為默認登陸shell。
2. 作為非登陸shell的交互式shell(比如登陸後通過bash啟動的子shell)。
3. 作為運行腳本的非交互shell。
以下就上述3種shell的環境變量文件查找進行詳細說明。
二、3種shell的環境變量文件
1.登陸shell
當一個用戶登陸Linux系統時,首先會檢查/etc/profile文件(也會根據該文件的設置檢查/etc/profile.d目錄下的所有文件),/etc/profile文件是系統上默認的bash shell主啟動文件,每個登錄用戶都會執行這個啟動文件。
其次,會檢查用戶的專屬啟動文件,大多數Linux發行版只用到下面4個啟動文件中的1~2個,這4個啟動文件起到一個共同的作用:定義用戶專屬的環境變量。
(1) $HOME/.bash_profile
(2) $HOME/.bashrc
(3) $HOME/.bash_login
(4) $HOME/.profile
通常shell會按照下列順序,找到第一個被找到的文件,余下的則會被忽略:
(2) $HOME/.bash_login
(3) $HOME/.profile
可以發現,上述3個文件中並沒有$HOME/.bashrc,這是因為該文件通常通過其他文件運行。
[root@host3 ~]# vim .bash_profile # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$PATH:$HOME/bin export PATH
可以看到$HOME/.bash_profile其實是讀取了$HOME/.bashrc文件。
2.交互式shell進程
當你的shell不是登陸系統時啟動的(比如在系統內輸入bash命令啟動的子shell),此時啟動的shell則成為交互式shell,因為該shell同樣可以提供一個命令提示符來輸入命令。此時與登陸shell的區別在於:不會檢查
/etc/profile文件和/etc/profile.d目錄下的所有文件,只會按順序檢查
(1) $HOME/.bash_profile
(2) $HOME/.bash_login
(3) $HOME/.profile
通常情況下,只檢查$HOME/.bashrc文件。
3.非交互式shell
系統在執行腳本時用到的就是這種shell,他沒有命令提示符,bash會通過BASH_ENV環境變量來檢查要啟動的文件,但CentOS系統中默認該變量為空
[root@host3 ~]# echo $BASH_ENV
[root@host3 ~]#
此時的環境變量則為繼承父shell的(腳本是當前shell中啟動的一個子進程),需要註意的是:如果父shell中定義但未導出的環境變量屬於局部變量,子shell不能繼承。
三、總結
通過前文知道了環境變量文件啟動的條件,通常情況下,個人永久環境變量存放在$HOME/.bashrc下,這一點適用於所有類型的shell進程;對於全局變量(所有linux用戶都需要用到的變量)可以放在/etc/profile文件中,但建議存放在/etc/profile.d目錄下一個以.sh結尾的文件中,它的好處是當系統版本升級時,/etc/profile文件會隨之更新,定制的變量設置則會清空。
幾句話說清Bash Shell環境變量